SqlAlchemy
1. 理解
之前使用的是 pymysql 插件,类似于 JDBC 的连接方式,通过写大量的 sql 语句来进行关联表、筛选字段等功能。SqlAlchemy 和 Flask-SqlAlchemy(后者是针对于 Flask 框架做了进一步的优化)则是通过类似于 Mybatis 的方式,将模型与表进行匹配,将 sql 中的关键字提取成方法,以此来获取数据。使用下来的话,官方文档给的例子或者说明并不是很清楚,需要多去网上找例子。
Flask-SqlAlchemy 通过配置可以自动管理多个数据源,比如默认数据源和数据源2,数据源3,在model里添加
__bind_key__="数据源别名"
来自动在query执行时切换数据源
2. 使用
2.1 数据库连接
通过读取配置文件获取参数,然后创建一个连接引擎,这个引擎会返回一个session对话,通过这个对话来对数据库进行操作
1 | # max_overflow: # 超过连接池大小外最多创建的连接 |
2.2 模型与表的关联
1 | from sqlalchemy import Column, Integer, String |
2.3 增
1 | # 如果表里存在自增字段,那么可以通过下面方式插入:创建一个类的实例,并显式写出每个字段的赋值,之后获取到session会话实例,将类的实例将入到会话中,并提交,最后将会话关闭 |
2.4 删
1 | # 简单来看这也算是一种查询:查询 User 类对应的数据表,过滤出 id 等于 del_id 的数据,调用 delete() 方法进行删除 |
2.5 query
session.query()
括号内可以是某个类,比如 session.query(User)
返回的结果就是 User 这个类对应的表的所有字段;也可以是类的字段,比如 session.query(User.id, User.username)
返回的结果就是 id 和 username 两个字段
2.6 join
目前用到的表和表之间关联有两种方式
- 直接在类中添加外键定义
1 | from sqlalchemy import Column, Integer, String, ForeignKey |
这种定义方式存在找不到或者不全的情况,更倾向于第二种
- 在 join 时显示写出
1 | res = session \ |
2.7 别名
如果 query 中存在多个重复字段,那么可以在后面添加 label("别名")
的方式来进行区分
2.8 filter
如果是已确定的条件,那么通过 session.query().filter(User.id == query_id)
这样显式写出来没问题,但是多数情况下,类似于 Mybatis 中 where 1 = 1
后跟着 if 判断语句,并不清楚会有几个查询条件需要放到 filter 中,这时候需要换成下面的写法
1 | # 需要 filter 中遍历的参数 |
2.9 分页
1 | # 通过 limit 和 offset 来实现分页 |
2.10 排序
1 | 通过 order_by() 方法来进行数据排序,可以添加多个字段排序规则 |
2.11 改
1 | # 和 filter 中查询条件一样,多数情况下不知道更新哪几个字段,需要动态赋值 |
2.12 聚合函数使用
2.12.1 group_concat
1 | # 对于分组来说,可以直接调用 group_by() 方法来指定按照哪些字段来分组 |
2.12.2 count
1 | # 虽然有直接的 count() 方法,但是在数据量大的时候,会很慢,所以需要换一种方式 |