本文主要介绍了Flask数据库的增删改查操作。首先,讲解了查询方法,包括1.x和2.x版本的SQLAlchemy查询语法差异,以及常用的SQLAlchemy查询过滤器和执行器。然后,通过示例代码演示了如何修改数据库中的数据,并强调了提交会话的重要性。最后,介绍了删除数据库中数据的方法,并提醒读者注意提交会话。通过本文,读者可以掌握Flask数据库的基本操作。
在2.x的SQLALchemy中,查询语法与flask-sqlalchemy略有不同:
1.x语法:模型类.query()
是等同于db.session.query(模型类, <查询语法>)
因为Flask-SQLAlchemy 向每个模型添加一个 query
对象。用于查询给定模型的实例。如:User.query
是 db.session.query(User)
的快捷方式。
2.x语法:db.session.execute()
是sqlalchemy 2.x版本后的语法,flask-sqlalchemy3.x版本都是基于sqlalchemy 2.x的语法使用。
模型类.query()
语法最大的问题是没有比较完善的语法提示。1.x和2.x语法相互参考对比 - sqlalchemy阅读文档
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 创建数据库的配置
class Config:
'''连接数据库'''
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/flaskdb'
SQLALCHEMY_TRACK_MODIFICATIONS = True
app.config.from_object(Config)
db = SQLAlchemy(app)
# 创建数据库模型类
class Role(db.Model):
'''角色表'''
__tablename__ = 'role'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
class User(db.Model):
'''用户表'''
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True) # primary_key=True默认设置自增长
name = db.Column(db.String(32), unique=True)
password = db.Column(db.String(32))
# 创建表关系 ForeignKey 外键约束
# MySQL的外键约束用来在两个表数据之间建立链接,其中一张表的一个字段被另一张表中对应的字段约束。
# 也就是说,设置外键约束至少要有两种表,被约束的表叫做从表(子表),另一张叫做主表(父表),属于主从关系。
role_id = db.Column(db.Integer, db.ForeignKey('role.id'))
# db.ForeignKey('role.id') 表示外键约束,role.id表示外键约束的值,role是表名,id是表中的字段名
if __name__ == '__main__':
with app.app_context():
# 清除所有的表
db.drop_all()
# 创建所有的表
db.create_all()
# 创建对象 插入数据
# 创建角色
role_werewolf = Role(name='狼人')
db.session.add(role_werewolf) # 添加到会话
db.session.commit() # 提交会话
# 创建角色
role_prophet = Role(name='预言家')
db.session.add(role_prophet) # 添加到会话
db.session.commit() # 提交会话
# 创建用户
# 张三是狼人,李四是预言家,王五是狼人
user_zhangsan = User(name='张三', password='zs123456', role_id=role_werewolf.id)
user_lisi = User(name='李四', password='ls123456', role_id=role_prophet.id)
user_wangwu = User(name='王五', password='ls123456', role_id=role_werewolf.id)
db.session.add_all([user_zhangsan, user_lisi, user_wangwu]) # 添加到会话
db.session.commit() # 提交会话
# Legacy Query API 2.0 style
# 在2.x的SQLALchemy中,查询语法与flask-sqlalchemy略有不同
# 查看所有对象的所有数据
print(User.query.all()) # flask-sqlalchemy 提供的快捷方式,实际上就是1.x的语法
print(db.session.query(User).all()) # 1.x 语法
print(db.session.execute(db.select(User)).scalars().all()) # 2.x 语法
# 查询第一个用户
print(User.query.first())
print(db.session.query(User).first())
print(db.session.execute(db.select(User)).scalar())
# 查询名为张三的用户
print(User.query.filter_by(name='李四').first())
print(db.session.query(User).filter_by(name='李四').first())
print(db.session.execute(db.select(User).filter_by(name='李四')).scalar())
常用的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对象,它包含指定范围内的结果 |
继续在查询方法中提供的代码进行修改:
# 修改数据库的值
user = User.query.filter_by(name='张三').first()
print(user.name)
user.name = 'New张三'
db.session.commit() # 提交会话
注意,一定要提交会话,否则不会生效。重新在cmd中查询数据表:
user = User.query.filter_by(name='张三').first()
print(user)
db.session.delete(user) #删除user这条数据
db.session.commit()
注意,一定要提交会话,否则不会生效。重新在cmd中查询数据表: