完成了类的声明定义之后,Declarative会通过python的metaclass对当前类型进行操作,根据定义的数据类型创
建table对象,构建程序中类型和数据库table对象之间的映射mapping关系
通过类型对象的metadata可以实现和数据库之间的交互,有需要时可以通过metadata发起create table操作,通
过Base.metadata.create_all()进行操作,该操作会检查目标数据库中是否有需要创建的表,不存在的情况下创建
对应的表
..
if __name__ == “__main__”:
Base.metadata.create_all()
..
3.5. 增加和更新
下面就是核心的数据对象的处理了,在程序代码中根据定义的数据类型创建对象的方式比较简单,执行如下的
操作创建一个对象:
$ user = User(name=”tom”, age=18)
$ print(user.name)
tom
$ print(user.id)
None
通过会话对象将对象数据持久化到数据库的操作
$ session.add(user)
$ print(user.id)
None
$ session.commit()
$ print(user.id)
1
3.6. 查询对象Query
Session是sqlalchemy和数据库交互的桥梁,Session提供了一个Query对象实现数据库中数据的查询操作
3.6.1. 常规查询query
直接指定类型进行查询
user_list = session.query(User)
for user in user_list:
print(user.name)
3.6.2. 指定排序查询
通过类型的属性指定排序方式
user_list = session.query(User).order_by(User.id) # 默认顺序
user_list = session.query(User).order_by(-User.id) # 指定倒序
user_list = session.query(User).order_by(-User.id, User.name) # 多个字段
3.6.3. 指定列查询
指定查询数据对象的属性,查询目标数据
user_list = session.query(User, User.name).all()
for u in user_list:
print(u.User, u.name)
3.6.4. 指定列属性别名
对于名称较长的字段属性,可以指定名称在使用时简化操作
user_list = session.query(Usre.name.label(‘n’)).all()
for user in user_list:
print(user.n)
3.6.5. 指定类型别名
对于类型名称较长的情况,同样可以指定别名进行处理
from sqlalchemy.orm import aliased
user_alias = aliased(User, name=’u_alias’)
user_list = session.query(u_alias, u_alias.name).all()
for u in user_list:
print(u.u_alias, u.name)
3.6.6. 切片查询
对于经常用于分页操作的切片查询,在使用过程中直接使用python内置的切片即可
user_list = session.query(User).all()[1:3]
..
3.7. 条件筛选filter
前一节中主要是对于数据查询对象query有一个比较直观的感受和操作,在实际使用过程中经常用到条件查询,
主要通过filter和filter_by进行操作,重点讲解使用最为频繁的filter条件筛选函数
3.7.1. 等值条件——equals / not equals
# equals
session.query(User).filter(User.id == 1) # 相等判断
# not equals
session.query(User).filter(User.name != ‘tom’)# 不等判断
3.7.2. 模糊条件——like
session.query(User).filter(User.name.like(‘%tom%’))
3.7.3. 范围条件——in / not in
# IN
session.query(User).filter(User.id.in_([1,2,3,4]))
session.query(User).filter(User.name.in_([
session.query(User.name).filter(User.id.in_[1,2,3,4])
]))
# NOT IN
session.query(User).filter(~User.id.in_([1,2,3]))
3.7.4. 空值条件——is null / is not null
# IS NULL
session.query(User).filter(User.name == None)
session.query(User).filter(User.name.is_(None)) # pep8
# IS NOT NULL
session.query(User).filter(User.name != None)
session.query(User).filter(User.name.isnot(None)) # pep8
3.7.5. 并且条件——AND
from sqlalchemy import and_
session.query(User).filter(User.name=’tom’).filter(User.age=12)
session.query(User).filter(User.name=’tom’, User.age=12)
session.query(User).filter(and_(User.name=’tom’, User.age=12))
3.7.6. 或者条件——OR
from sqlalchemy import or_
session.query(User).filter(or_(User.name=’tom’, User.name=’jerry’))
3.7.7. SQL语句查询
某些特殊情况下,我们也可能在自己的程序中直接使用sql语句进行操作
from sqlalchemy import text
session.query(User).from_statement(
text(‘select * from users where name=:name and age=:age’))
.params(name=’tom’, age=12).all()
3.8. 查询结果
3.8.1. all()函数返回查询列表
session.query(User).all()
[..]
3.8.2. filter()函数返回单项数据的列表生成器
session.query(User).filter(..)
<..>
3.8.3. one()/one_or_none()/scalar()返回单独的一个数据对象
session.query(User).filter(..).one()/one_or_none()/scalar()
|