安装
pip install flask-sqlalchemy
文档
Flask-SQLAlchemy — Flask-SQLAlchemy 2.0 documentation (pythondoc.com)http://www.pythondoc.com/flask-sqlalchemy/index.html组件初始化
基本配置
- flask-sqlalchemy 的相关配置也封装到了 flask 的配置项中, 可以通过app.config属性 或 配置加载方案 (如config.from_object) 进行设置
- 配置详情
数据库URI(连接地址)格式: 协议名://用户名:密码@数据库IP:端口号/数据库名,
如:app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test31'
需要注意的是,如果连接的是MySQL数据库,则协议名需要改为mysql+pymysql:
如:
'mysql+pymysql://root:1234@127.0.0.1/jsonflow?charset=utf8mb4'
创建模型类
- flask-sqlalchemy 的关系映射和 Django-orm 类似:
- 类 对应 表
- 类属性 对应 字段
- 实例对象 对应 记录
注意点:
- 模型类必须继承 db.Model, 其中 db 指对应的组件对象
- 表名默认为类名小写, 可以通过 __tablename__类属性 进行修改
- 类属性对应字段, 必须是通过 db.Column() 创建的对象
- 可以通过 create_all() 和 drop_all()方法 来创建和删除所有模型类对应的表
- 可以使用Flask-Migrate扩展解决该问题
常用的字段类型
常用的字段选项
primary_key 如果设为 True,这列就是表的主键
unique 如果设为 True,这列不允许出现重复的值
index 如果设为 True,为这列创建索引,提升查询效率
nullable 如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值
default 为这列定义默认值
doc 字段说明
模型例子
class User(db.Model):
__tablename__ = 't_user' # 设置表名, 表名默认为类名小写
id = db.Column(db.Integer, primary_key=True) # 设置主键, 默认自增
name = db.Column('username', db.String(20), unique=True) # 设置字段名 和 唯一约束
age = db.Column(db.Integer, default=10, index=True) # 设置默认值约束 和 索引
查询
在Flak-SQLAlchemy中,查询操作是通过query对象操作数据。
以User模型为例
- 查询全部
User.query.all()
- 带条件的查询
User.query.filter_by(age=18).all()
User.query.filter(age==18).all()
需要注意的是,filter查询更适合复杂查询,如模糊查询、多条件查询等。
- 多条件查询
from sqlalchemy import and_,or_
User.query.filter(and_(User.name=="user", User.age==18)).all()
User.query.filter(or_(User.name=="user", User.age==18)).all()
and_表示括号内的表达式都要满足
or_表示括号内的表达式满足任意一个即可
- 模糊查询
User.query.filter(User.username.like('jingqi')).all())
User.query.filter(User.username.notlike('jingqi%')).all()
like表示包含
notlike表示不包含
%表示任意多个字符
_表示任意一个字符
- 主键查询
User.query.get(1)
表示获取id为1的数据
- 限制查询结果的数据
User.query.filter(User.username!='jingqi').limit(2).all()
User.query.filter(User.username!='jingqi').offset(2).all()
User.query.filter(User.username!='jingqi').slice(2,3).all()
limit:可以限制每次查询的时候只查询几条数据。
offset:可以限制查找数据的时候过滤掉前面多少条
slice(start,stop)
方法表示切片操作。也可以使用[start:stop]
的方式来进行切片操作,开发中常用的是中括号进行切片
- 对字段中的json数据进行查询
bus_query.filter(Business.content.op('->>')('$.GnypMain[0].receipt_date')
其中bus_query和Business都是模型类,而content是json字段名。
- 更多查询操作
增删改
在Flak-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。
会话用db.session表示。在准备把数据写入数据库前,需要先将数据添加到会话中然后调用commit()方法提交会话。
增
user = User()
user.username = 'fuyong'
user.password = '123'
# 将新创建的用户添加到数据库会话中
db.session.add(user)
# 将数据库会话中的变动提交到数据库中, 如果不commit, 数据库中是没有变化的.
db.session.commit()
删
# 获取用户对象
user = User.query.filter_by(id=1).first() #查询出id=1的用户
# 删除用户
db.session.delete(user)
#提交数据库会话
db.session.commit()
改
# 获取用户对象
user = User.query.filter_by(id=2).first()
# 直接赋值更新数据
user.password = '123567'
#提交数据库会话
db.session.commit()