Flask-SQLAlchemy 数据库会话与查询操作详解
本文详细介绍 Flask-SQLAlchemy 的核心用法,涵盖数据库会话(db.session)的提交、回滚与错误处理机制。深入解析 query 对象的过滤器(filter/filter_by)与执行器(first/all/get)的使用,并通过代码示例展示数据插入、更新、删除及一对多关联查询的具体实现,帮助开发者掌握 Flask 中的 ORM 数据操作。
数据库基本操作
在 Flask-SQLAlchemy 框架中,数据的插入、修改与删除操作均依赖于数据库会话(Database Session)进行管理。该会话由 db.session 对象表示。在将数据持久化至数据库之前,必须先将待操作的数据对象添加至会话中,随后调用 commit() 方法以提交会话,确保变更生效。
引入数据库会话的主要目的是保障数据的一致性。若部分更新失败,会话机制可防止数据处于不一致状态。提交操作会将会话对象中的所有变更一次性写入数据库;如果在写入过程中发生错误,整个会话将失效,需进行相应处理。
数据库会话支持回滚操作。通过调用 db.session.rollback() 方法,可以将数据库状态恢复到会话提交数据之前的状态,从而撤销未提交的更改。
在 Flask-SQLAlchemy 中,数据查询通过 query 对象执行。最基本的查询是获取表中的所有数据,开发者还可以利用过滤器(Filters)进行更精确的条件筛选,以获取特定结果。
将数据添加到会话中的示例如下:
user = User(name='python')
db.session.add(user)
db.session.commit()在视图函数中定义模型类
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test'
#设置每次请求结束后会自动提交数据库中的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
class Role(db.Model):
# 定义表名
__tablename__ = 'roles'
# 定义列对象
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
us = db.relationship('User', backref='role')
#repr()方法显示一个可读字符串
def __repr__(self):
return 'Role:%s'% self.name
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, index=True)
email = db.Column(db.String(64),unique=True)
pswd = db.Column(db.String(64))
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __repr__(self):
return 'User:%s'%self.name
if __name__ == '__main__':
db.drop_all()
db.create_all()
ro1 = Role(name='admin')
ro2 = Role(name='user')
db.session.add_all([ro1,ro2])
db.session.commit()
us1 = User(name='wang',email='wang@163.com',pswd='123456',role_id=ro1.id)
us2 = User(name='zhang',email='zhang@189.com',pswd='201512',role_id=ro2.id)
us3 = User(name='chen',email='chen@126.com',pswd='987654',role_id=ro2.id)
us4 = User(name='zhou',email='zhou@163.com',pswd='456789',role_id=ro1.id)
db.session.add_all([us1,us2,us3,us4])
db.session.commit()
app.run(debug=True)常用的 SQLAlchemy 查询过滤器
| 过滤器 | 说明 |
|---|---|
| filter() | 把过滤器添加到原查询上,返回一个新查询 |
| filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
| limit | 使用指定的值限定原查询返回的结果 |
| offset() | 偏移原查询返回的结果,返回一个新查询 |
| order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
| group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
常用的 SQLAlchemy 查询执行器
| 方法 | 说明 |
|---|---|
| all() | 以列表形式返回查询的所有结果 |
| first() | 返回查询的第一个结果,如果未查到,返回None |
| first_or_404() | 返回查询的第一个结果,如果未查到,返回404 |
| get() | 返回指定主键对应的行,如不存在,返回None |
| get_or_404() | 返回指定主键对应的行,如不存在,返回404 |
| count() | 返回查询结果的数量 |
| paginate() | 返回一个Paginate对象,它包含指定范围内的结果 |
创建表:
db.create_all()删除表
db.drop_all()插入一条数据
ro1 = Role(name='admin')
db.session.add(ro1)
db.session.commit()
#再次插入一条数据
ro2 = Role(name='user')
db.session.add(ro2)
db.session.commit()一次插入多条数据
us1 = User(name='wang',email='wang@163.com',pswd='123456',role_id=ro1.id)
us2 = User(name='zhang',email='zhang@189.com',pswd='201512',role_id=ro2.id)
us3 = User(name='chen',email='chen@126.com',pswd='987654',role_id=ro2.id)
us4 = User(name='zhou',email='zhou@163.com',pswd='456789',role_id=ro1.id)
db.session.add_all([us1,us2,us3,us4])
db.session.commit()查询:filter_by精确查询
返回名字等于wang的所有人
User.query.filter_by(name='wang').all()first()返回查询到的第一个对象
User.query.first()all()返回查询到的所有对象
User.query.all()filter模糊查询,返回名字结尾字符为g的所有数据。
User.query.filter(User.name.endswith('g')).all()get(),参数为主键,如果主键不存在没有返回内容
User.query.get()逻辑非,返回名字不等于wang的所有数据。
User.query.filter(User.name!='wang').all()逻辑与,需要导入and,返回and()条件满足的所有数据。
from sqlalchemy import and_
User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()逻辑或,需要导入or_
from sqlalchemy import or_
User.query.filter(or_(User.name!='wang',User.email.endswith('163.com'))).all()not_ 相当于取反
from sqlalchemy import not_
User.query.filter(not_(User.name=='chen')).all()查询数据后删除
user = User.query.first()
db.session.delete(user)
db.session.commit()
User.query.all()更新数据
user = User.query.first()
user.name = 'dong'
db.session.commit()
User.query.first()使用update
User.query.filter_by(name='zhang').update({'name':'li'})关联查询示例
角色和用户的关系是一对多的关系,一个角色可以有多个用户,一个用户只能属于一个角色。
查询角色的所有用户:
#查询roles表id为1的角色
ro1 = Role.query.get(1)
#查询该角色的所有用户
ro1.us查询用户所属角色:
#查询users表id为3的用户
us1 = User.query.get(3)
#查询用户属于什么角色
us1.role
到此这篇关于Flask-SQLALchemy基本使用方法的文章就介绍到这了,更多相关Flask SQLALchemy使用内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













