数据库基本操作
在Flask-SQLAlchemy
中,插入、修改、删除操作,均由数据库会话管理。
会话用 db.session
表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit()
方法提交会话。
在 Flask-SQLAlchemy
中,查询操作是通过 query
对象操作数据。
最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。
常用的SQLAlchemy查询过滤器
常用的SQLAlchemy查询执行器
创建表
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-script
的manager
对象上。
安装及执行
-
安装要在虚拟环境py_flask中安装
pip install flask-migrate
-
执行命令分三步:
-
init
: 创建迁移文件夹的 终端执行:python flask_03_sqlal.py db init
生成文件夹migrations
,此时还没有任何东西 -
migrate -m
: 生成迁移文件的 -m 加注释 终端执行: 首先在mysql执行创建数据库的命令,
然后执行:python flask_03_sqlal.py db migrate
-
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) 版本号