IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Flask入门学习(十三):flask数据库的增删改查

    52txr发表于 2024-07-26 17:46:00
    love 0

    本文主要介绍了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的语法使用。

      • 2.x语法更加接我们时使用sql语句去查询数据。特别要注意的是2.x的各个方法调用都要按顺序,和sql一样,如where要在group_by前调用。
    • 使用模型类.query()语法最大的问题是没有比较完善的语法提示。
    • 旧版本的flask-sqlalchemy是基于sqlalchemy 1.x版本的,但是新版本依旧可以使用旧版本的查询语法。

    1.x和2.x语法相互参考对比 - sqlalchemy阅读文档

    SQLAlchemy 2.0 Documentation

    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中查询数据表:

    删除方法



沪ICP备19023445号-2号
友情链接