最常使用的SQLAlchemy列选项
- unique | 如果设为True,这列不允许出现重复的值
- primary_key | 如果设为True,这列就是表的主键
- index | 如果设为True,为这列创建索引,提升查询效率
- nullable | 如果设为True,这列允许使用空值,False则不允许使用空值
- default | 为这列定义默认值
- primary_key | 如果设为True,这列就是表的主键
一对多关系
- 添加到Variable模型中的env_id列被定义为外键,就是这个外键建立起了关系,传给db.ForeignKey()的参数’environments.id’表明,这列的值是environments.id表中行的id值。
- 添加到Environments模型中的variable属性代表这个关系的面向对象视角。对于一个Environments类的实例,其variable属性将返回与角色相关联的用户组成的列表
- db.relationship()的第一个参数表明这个关系的另一端是哪个模型
- db.relationship()的backref参数向Environments模型中添加一个variable属性,从而定义反向关系
- db.relationship()的lazy=dynamic参数表明:不加载记录,但提供加载记录的查询。
- default | 为这列定义默认值
常用的SQLAlchemy查询执行器
常用的SQLAlchemy查询过滤器
注意
- 查询过滤器返回的都是 BaseQuery类型对象, 该对象支持链式调用, 即可以续接其他过滤器 或 执行器
- 如果考虑到性能优化, 应该避免 select *, 只查询需求字段 (select * 会导致数据库服务器去获取&解析&处理目标数据的每个字段, 对服务器资源造成浪费, 并且不必要的数据也会占用更多的 网络IO 和 数据库查询缓存)
实例代码
"""
查询所有用户数据
User.query.all()
查询有多少个用户
User.query.count()
查询第1个用户
User.query.first()
User.query.get(1)
查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id=4).all()
User.query.filter(User.id == 4).all()
查询名字结尾字符为g的所有用户[开始 / 包含]
User.query.filter(User.name.endswith("g")).all()
User.query.filter(User.name.startswith("w")).all()
User.query.filter(User.name.contains("n")).all()
User.query.filter(User.name.like("%n%g")).all() 模糊查询
查询名字和邮箱都以li开头的所有用户[2种方式]
User.query.filter(User.name.startswith("li"), User.email.startswith("li")).all()
from sqlalchemy import and_
User.query.filter(and_(User.name.startswith("li"), User.email.startswith("li"))).all()
查询age是25 或者 `email`以`itheima.com`结尾的所有用户
from sqlalchemy import or_
User.query.filter(or_(User.age == 25, User.email.endswith("itheima.com"))).all()
查询名字不等于wang的所有用户[2种方式]
from sqlalchemy import not_
User.query.filter(not_(User.name == "wang")).all()
User.query.filter(User.name != "wang").all()
查询id为[1, 3, 5, 7, 9]的用户
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
所有用户先按年龄从小到大, 再按id从大到小排序, 取前5个
User.query.order_by(User.age, User.id.desc()).limit(5).all()
分页查询, 每页3个, 查询第2页的数据
pn = User.query.paginate(2, 3)
pn.items 获取该页的数据 pn.page 获取当前的页码 pn.pages 获取总页数
1、创建表
>>> db.create_all()
2、删除表
>>> db.drop_all()
3、插入行
>>>db.session.add(variable)
>>>db.session.commit()
4、 查询数据
(1)all(查询全部数据)
Environments.query.all()
(2)filter_by查询(精确查询)
Environments.query.filter_by(id=id).first()
(3)join(联表一对多查询)
Variable.query.filter_by(env_id=env_id,id=id).join(Environments,Variable.env_id == Environments.id).first_or_404()
(4)count(返回查询结果的数量)
Environments.query.filter_by(id=id).count()
5、删除数据
db.session.delete(variablelists)
db.session.commit()
6、删除多条数据
variablelists= Variable.query.filter_by(env_id=env_id).all()
for var in variablelists:
db.session.delete(var)
db.session.commit()