python day45_Flask入门

作者: g_s_007 | 来源:发表于2018-07-18 22:10 被阅读0次

    数据库基本操作

    Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。

    会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit()方法提交会话。
    Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。

    最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。

    常用的SQLAlchemy查询过滤器

    14.JPG

    常用的SQLAlchemy查询执行器

    15.JPG

    创建表

    db.create_all()
    

    删除表

    db.drop_all()
    

    注意!!!

    创建表和删除表 只是我们在初学阶段使用 以后真正开发 不会用

    具体示例操作

    需求: 创建两张表 一个用户表一个角色表,使用SQLAlchemy 进行基本的增删改查

    创建表并添加数据:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    
    app = Flask(__name__)
    # manager = Manager(app)
    # 配置
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    # 数据库
    my_db = SQLAlchemy(app)
    # 创建模型
    class User(my_db.Model):
        __tablename__ = 't_user'
        id = my_db.Column(my_db.Integer,primary_key=True)
        name = my_db.Column(my_db.String(64),unique=True)
        email = my_db.Column(my_db.String(64),unique=True)
        password = my_db.Column(my_db.String(64))
        # 在多的一方 定义外键
        role_id = my_db.Column(my_db.Integer,my_db.ForeignKey('t_role.id'))
    
    
    
    class Role(my_db.Model):
        __tablename__ = 't_role'
        id = my_db.Column(my_db.Integer,primary_key=True)
        name = my_db.Column(my_db.String(64),unique=True)
        # 在一的一方 定义关系引用
        users = my_db.relationship('User',backref = 'role')
    
    
    if __name__ == '__main__':
        my_db.drop_all()
        my_db.create_all()
        ro1 = Role(name='admin')
        my_db.session.add(ro1)
        my_db.session.commit()
        # 再次插入一条数据
        ro2 = Role(name='user')
        my_db.session.add(ro2)
        my_db.session.commit()
        us1 = User(name='wang', email='wang@163.com', password='123456', role_id=ro1.id)
        us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=ro2.id)
        us3 = User(name='chen', email='chen@126.com', password='987654', role_id=ro2.id)
        us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=ro1.id)
        us5 = User(name='tang', email='tang@baidu.com', password='158104', role_id=ro2.id)
        us6 = User(name='wu', email='wu@gmail.com', password='5623514', role_id=ro2.id)
        us7 = User(name='qian', email='qian@gmail.com', password='1543567', role_id=ro1.id)
        us8 = User(name='liu', email='liu@baidu.com', password='867322', role_id=ro1.id)
        us9 = User(name='li', email='li@163.com', password='4526342', role_id=ro2.id)
        us10 = User(name='sun', email='sun@163.com', password='235523', role_id=ro2.id)
        my_db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
        my_db.session.commit()
        # app.run(debug=True)
    

    查询:

    """查询所有用户数据
    查询有多少个用户
    查询第1个用户
    查询id为4的用户[3种方式]
    查询名字结尾字符为g的所有数据[开始/包含]
    查询名字不等于wang的所有数据[2种方式]
    查询名字和邮箱都以 li 开头的所有数据[2种方式]
    查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
    查询id为 [1, 3, 5, 7, 9] 的用户列表
    查询name为liu的角色数据
    查询所有用户数据,并以邮箱排序
    每页3个,查询第2页的数据"""
    
    进入ipython:
        
    """
    #查询所有用户数据
    User.query.all()
    
    #查询有多少个用户
    User.query.count()
    
    #查询第1个用户
    User.query.first()
    
    #查询id为4的用户[3种方式]
    User.query.get(4)
    User.query.filter_by(id=4).first()
    User.query.filter(User.id==4).first()
    
    #基本查询两个都可以. filter更强大, 可以支持更多的查询语句
    
    
    #查询名字结尾字符为g的所有数据[开始/包含]
    User.query.filter(User.name.endswith("g")).all()
    User.query.filter(User.name.contains("o")).all()
    
    
    #查询名字不等于wang的所有数据[2种方式]
    from sqlalchemy import not_
    User.query.filter(not_(User.name == 'wang')).all()
    User.query.filter(User.name != 'wang').all()
    
    
    #查询名字和邮箱都以 li 开头的所有数据[2种方式]
    from sqlalchemy import and_
    In [22]: User.query.filter(and_(User.name.startswith("li"), User.email.startswith("li"))).all()
    
    In [23]: User.query.filter(User.name.startswith("li"), User.email.startswith("li")).all()
    
    #查询password是 `123456` 或者 `email` 以 `baidu.com` 结尾的所有数据
    User.query.filter(or_(User.password=="123456", User.email.endswith("itheima.com"))).all()
    
    #查询id为 [1, 3, 5, 7, 9] 的用户列表
    User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
    
    #查询name为liu的角色数据
    user = User.query.filter(User.name=='liu').first()
    user.role.name
    
    
    
    #查询所有用户数据,并以邮箱排序
    User.query.order_by('email').all()
    
    
    #每页3个,查询第2页的数据
    # 第一个参数是:第几页,第二个参数是每页个数 第三个参数是error信息 不显示
    paginate = User.query.paginate(2, 3, False)
    
    paginate.items # 查询数据
    
    paginate.page # 当前页数
    
    paginate.pages # 总页数
    

    数据库迁移

    • 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。
    • 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。
    • Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。
    • 为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-scriptmanager对象上。

    安装及执行

    • 安装要在虚拟环境py_flask中安装

      pip install flask-migrate

    • 执行命令分三步:

      1. init : 创建迁移文件夹的 终端执行: python flask_03_sqlal.py db init
        生成文件夹 migrations ,此时还没有任何东西
      2. migrate -m: 生成迁移文件的 -m 加注释 终端执行: 首先在mysql执行创建数据库的命令,
        然后执行:python flask_03_sqlal.py db migrate
      3. upgrate: 执行迁移
        python flask_03_sqlal.py db migrate
        以后要修改表结构, 只需要重复2,3两即可.
    • 完整的指令如下:

    • 实际操作顺序:

    • 1.python 文件 db init

    • 2.python 文件 db migrate -m"版本名(注释)"

    • 3.python 文件 db upgrade 然后观察表结构

    • 4.根据需求修改模型

    • 5.python 文件 db migrate -m"新版本名(注释)"

    • 6.python 文件 db upgrade 然后观察表结构

    • 7.若返回版本,则利用 python 文件 db history查看版本号

    • 8.python 文件 db downgrade(upgrade) 版本号

    相关文章

      网友评论

        本文标题:python day45_Flask入门

        本文链接:https://www.haomeiwen.com/subject/jagapftx.html