python day45_Flask入门

数据库基本操作

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

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

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

常用的SQLAlchemy查询过滤器

python day45_Flask入门_第1张图片
14.JPG

常用的SQLAlchemy查询执行器

python day45_Flask入门_第2张图片
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:[email protected]: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='[email protected]', password='123456', role_id=ro1.id)
    us2 = User(name='zhang', email='[email protected]', password='201512', role_id=ro2.id)
    us3 = User(name='chen', email='[email protected]', password='987654', role_id=ro2.id)
    us4 = User(name='zhou', email='[email protected]', password='456789', role_id=ro1.id)
    us5 = User(name='tang', email='[email protected]', password='158104', role_id=ro2.id)
    us6 = User(name='wu', email='[email protected]', password='5623514', role_id=ro2.id)
    us7 = User(name='qian', email='[email protected]', password='1543567', role_id=ro1.id)
    us8 = User(name='liu', email='[email protected]', password='867322', role_id=ro1.id)
    us9 = User(name='li', email='[email protected]', password='4526342', role_id=ro2.id)
    us10 = User(name='sun', email='[email protected]', 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入门)