1.在已有的数据库上建立model对象有两种办法。
1> 先创建Table对象,然后创建要映射的object对象,用mapper将之映射起来。例子如下:
department = Table('crew_section',
Column('rid',Integer,primary_key=True),
Column('birthdate', NormalDate),
Column('employmenttype',Integer,ForeignKey(department.c.rid)),
meta,autoload=True,autoload_with=engine)
class Department(object):
def __repr__(self):
return "<%s>"% repr(self.__class__.__name__)
mapper(Department, department)
crew_section是数据库中表的名字,在瘟到死下大小写不敏感,所以不用区分大小写,在os x下是则需要区分大小写。
用这种办法创建出来的映射对象,只重载明确表示出来的字段如代码中的‘birthdate’字段(做自定义的类型转换)、'employmenttype'字段(做映射的外键),其他未重载的字段可以直接以属性的形式倍调用如 department.other.
2>直接继承自DeclarativeBase:
class CrewBase(DeclarativeBase):
__tablename__ ='crew_base'
#{ Attributes
id = Column('rid', Integer, primary_key=True)
name = Column('crewbasecode', PopularString)
description = Column('description', Text)
#}
def __repr__(self):
return " <Base code:%s ,description:%s>" % (self.code, self.description)
crew_base 是数据库的表名。
这样做必须对所有的字段重载,否则其他的属性不能被调用。
对于已有的数据库,建议使用这种办法,这样可以清楚表明对象的设计结构。而且可以将建好的数据库字段名改为自己认为比较合适的。(个人项目比较特殊)
2 一对多的操作(基于继承自 DeclarativeBase的办法)
department_id = Column('employmenttype', Integer, ForeignKey(Department.id))
department = relation(Department, backref=backref('crew_member', order_by=Department.id))
第一行代码将数据库中的字段以外键形式重载,第二行代码建立外键,外键映射对象,本对象之间的关系
之后可以直接实例化对象。用instance.department来取出对象的department属性。
crew_member => 本对象所映射的表名。
这里 一个department具有多个crew 主动关联的一方在crew。
3. 多对多的操作。
先将多对多关系的中间表建立Table对象:
crew_base_period = Table('crew_base_period', metadata,
Column('crewrid',Integer, ForeignKey('crew_member.rid')),
Column('crewbaserid', Integer, ForeignKey('crew_base.rid')),
Column('startdate', NormalDate),
Column('enddate', NormalDate)
)
在主动关联的一方写下如下语句:
bases = relation(CrewBase, secondary=crew_base_period, backref='crew_member')
CrewBase是要关联的对象,将中间表对象传给secondary参数,backref为自己的表。
实例化之后就可以直接调用instance.bases来查找自己想要的属性。
4.自定义类型转型
class PopularString(types.TypeDecorator):
"to remove some unuseful data and convert the decode it"
impl = types.String
def process_bind_param(self, value, dialect):
return "PREFIX:" + value
def process_result_value(self, value, dialect):
return value.strip().decode('gbk')
impl是要转化的值本来的类型,prosess_bind_param处理从程序到db的操作,prosess_bind_param处理从db到程序的操作。
定义好之后,直接将类名写到定义Column的地方就好了。如:
Column('birthdate', NormalDate)
但是很奇怪的是,用自定义好的类型,用query.filter()查询,类型转换可以起作用。如果用from_statement发送sql就要用下面的办法。
typemap = {
'lastname' : PopularString,
'firstname' : PopularString,
'birthdate' : NormalDate,
'inservicedate' : NormalDate,
'outservicedate': NormalDate,
'upgradeddate' : NormalDate,
'sex': PopularGender
}
crew = DBSession.query(Crew).from_statement(text("SELECT * from crew_member where " +
"rtrim(crew_member.lastname) || rtrim(crew_member.firstname) " +
" like '%" + crew_name + "%'", typemap=typemap)).first()
(再次说明,本人的项目很妖怪,其实不用写这么复杂,如果你不小心google到这里来了,希望不要误导了你)
需要先格外的写个text,typemap中即为{‘字段名’:自定义类型}的字典。
5. 其他的一些小问题
sqlalchemy可以直接这样操作字段(以Crew为对象)
crew = DBSession.query(Crew).filter((Crew.last_name + Crew.first_name).like(u'%XX%'.encode('gbk'))).first()
即使用 + 来代替数据库的连接符
filter 和 from_statement 似乎有冲突,不能对同一条记录查询。
6.一切框架都是浮云(by Hsu Jeffrey )
Jeffrey兄说得很对。。。最近两个星期研究sqlalchemy看来,不管是怎么样的操作,其实归根到底,依旧是化为sql来对数据库操作。所以还是得好好研究研究底层点的东西。
附件为例子,包含本文大部分的例子。
分享到:
相关推荐
1. 创建映射类的实例(Instance) 前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象:复制代码 代码如下:>>> ed_...
昨天简单介绍了SQLAlchemy的使用,但是没有能够涉及其最精彩的ORM部分,今天我将简单说明一下,当然主要还是讲解官方文档的内容,由于是学习笔记,有可能存在精简或者自己理解的部分,不做权威依据。 当我们开始使用...
初次学习,也没实质感觉到SQLAlchemy的好处,不过看其介绍的很多大公司均采用该项目,而且其支持的数据库还是蛮丰富的,所以我觉得花点时间研究还是值得的。不过令人遗憾的是关于SQLAlchemy的中文资料比较少,所以...
1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中:复制代码 代码如下:ed_user = User(‘ed...
前期我们做了充足的准备工作,现在该是关键内容之一查询了,当然前面的文章中或多或少的穿插了些有关查询的东西,比如一个查询(Query)对象就是通过Session会话的query()方法获取的,需要注意的是这个方法的参数数目...
### Python学习笔记说明的PPT知识点详述 #### 一、Python简介 - **Python的特点**: - **优雅**:简洁清晰的语法结构。 - **明确**:避免使用隐晦的方式解决问题。 - **简单**:尽可能简化语言结构。 - **...
【标题】"《传智Python就业班》学习笔记"揭示了这是一个关于Python编程语言的教育课程,特别是针对求职者或想要提升Python技能以在职场上获得更好机会的学习者。这可能是一个综合性的学习资源,涵盖了从基础到进阶的...
以下是从提供的“flask框架学习笔记”中提取并展开的重要知识点。 ### 一、Flask 路由 Flask 中的路由是用来匹配 URL 的一种方式,通过装饰器 `@app.route` 来定义。例如: ```python @app.route('/') def index()...
"Python全套学习笔记"涵盖了从入门到进阶的所有关键知识点,是学习Python编程的理想资源。以下是一些主要的学习要点: 1. **基础语法**:Python的基础始于变量、数据类型(如整数、浮点数、字符串、布尔值)以及...
通过这本书的学习笔记,我们可以了解到许多关于Flask和Web开发的关键知识点。 1. **Flask基础**:首先,书中会介绍Flask的基本结构,包括如何创建一个基本的Flask应用、定义路由、编写视图函数以及如何返回HTTP响应...
在本篇“Pyramid学习笔记3”中,我们将聚焦于Pyramid框架的用户注册功能的实现,这是一个Python Web开发框架,以其灵活性和可扩展性著称。Pyramid提供了构建复杂和简单Web应用所需的基础,而不会强加特定的设计模式...
**Flask学习笔记(5)源码** 在深入探讨Flask框架的源码之前,我们先来了解一下Flask的基本概念。Flask是一个轻量级的Web服务器网关接口(WSGI)微框架,由Armin Ronacher开发。它以其简单易用、高度可扩展性而受到...
在本篇Flask学习笔记(10)中,我们将深入探讨Python Web开发框架Flask的高级用法和核心概念。Flask是一个轻量级、灵活的框架,它以简洁的API和可扩展性赢得了开发者们的喜爱。让我们一起探索Flask的魅力。 首先,`...
【Python学习笔记,100天】是一份全面且深入的Python编程教程,旨在帮助初学者和有一定基础的开发者在100天内系统地掌握Python语言的核心概念和技术。这份笔记可能包含了从基础语法到高级特性的详尽讲解,通过每一天...
**Flask学习笔记8源码解析** 在Python的Web开发领域,Flask是一个轻量级且灵活的框架,因其简洁的API和强大的扩展性而受到开发者喜爱。本篇笔记将深入探讨Flask的核心概念和常见用法,通过分析"demo8"这个压缩包中...
《老男孩Python全栈开发学习笔记》是一部针对Python开发者进阶至全栈开发的重要学习资料。这份压缩包包含了作者harborkyi对于Python全栈开发的深入理解和实践总结,尤其适合那些希望提升自身技能,从单一领域跨越到...
**FLask学习笔记(2)源码分析** 在Python Web开发领域,Flask是一个轻量级、灵活且强大的Web框架。本笔记将深入探讨在Flask框架中进行开发的一些核心概念和技术,通过分析"demo2"这个源码实例,帮助读者更深入地...
这份"Python学习笔记都(是干货).zip"压缩包显然包含了深入的Python学习资源,特别是以PDF格式的笔记形式呈现。以下是一些可能涵盖的重要Python知识点: 1. **基础语法**:Python的基础语法包括缩进、变量声明、...
这篇学习笔记将深入探讨如何使用PyQt的QtSql模块来操作SQLite数据库。 首先,你需要确保已经安装了PyQt5和包含SQLite支持的SQLAlchemy库。安装命令通常是: ``` pip install PyQt5 pip install sqlalchemy ``` 接...