Flask数据库 D:使用扩展包flask-sqlalchemy来操作数据库(增删改查) E:通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升 U:常用的SQLAlchemy字段类型
类型名 |
python中类型 |
说明 |
Integer |
int |
普通整数,一般是32位 |
SmallInteger |
int |
取值范围小的整数,一般是16位 |
BigInteger |
int或long |
不限制精度的整数 |
Float |
float |
浮点数 |
Numeric |
decimal.Decimal |
普通整数,一般是32位 |
String |
str |
变长字符串 |
Text |
str |
变长字符串,对较长或不限长度的字符串做了优化 |
Unicode |
unicode |
变长Unicode字符串 |
UnicodeText |
unicode |
变长Unicode字符串,对较长或不限长度的字符串做了优化 |
Boolean |
bool |
布尔值 |
Date |
datetime.date |
时间 |
Time |
datetime.datetime |
日期和时间 |
LargeBinary |
str |
二进制文件 |
常用的SQLAlchemy列选项
选项名 |
说明 |
primary_key |
如果为True,代表表的主键 |
unique |
如果为True,代表这列不允许出现重复的值 |
index |
如果为True,为这列创建索引,提高查询效率 |
nullable |
如果为True,允许有空值,如果为False,不允许有空值 |
default |
为这列定义默认值 |
常用的SQLAlchemy关系选项
选项名 |
说明 |
backref |
在关系的另一模型中添加反向引用 |
primary join |
明确指定两个模型之间使用的联结条件 |
uselist |
如果为False,不使用列表,而使用标量值 |
order_by |
指定关系中记录的排序方式 |
secondary |
指定多对多中记录的排序方式 |
secondary join |
在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件 |
①安装扩展包及导包 安装flask-sqlalchemy:pip install flask-sqlalchemy 如果连接的是mysql数据,需安装mysqldb:pip install flask-sqlalchemy 导包:from flask_sqlalchemy import SQLAlchemy ②配置相关数据库的设置 #数据库信息设置 app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘mysql://root:[email protected]:3306/数据库名‘ # 动态追踪修改设置,如未设置只会提示警告,极大影响mysql性能app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = False ③创建连接数据库的对象 db = SQLAlchemy(app) ④定义模型类,继承db.Model 定义数据库的表名: __tablename__ 设置字段: 字段=db.Column(db.字段类型,字段选项) 例如:id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) 设置关联属性: books = db.relationship(‘Book‘, backref=‘author‘, lazy=‘dynamic‘) 给该模型类添加一个属性,第一个参数为多类类名,通过这个属性可以查询一对多所有对象 第二个参数backref =’该类类名小写‘,是反向给多类申明一个新属性 第三个参数指定是lazy属性,即何时加载数据,dynamic指的是在访问属性的时候,并没有在内存中加载数据,而是返回一个query对象, 需要执行相应方法才可以获取对象,比如.all() ⑤无迁移式的建表和删表 db.drop_all() 删除该数据库所有的表 db.create_all() 在该数据库下创建所有模型类映射的表
增删改查 增:①创建对象: b =Book(name=‘图书‘) ②把数据添加到用户会话:db.session.add(b) 如果多个对象,使用db.session.add_all([b1,b2,b3]) ③提交用户会话到数据库: db.session.commit() 删:第一种方式: ①查出该对象: b=Book.query.get(1) ②从用户会话删除该对对象: db.session.delete(b) ③提交用户会话: db.session.commit() 第二种方式: ①查出对象直接删除: Book.query.get(1).delete() ②提交用户会话: db.session.commit() 改:①查出该对象: b=Book.query.get(1) ②修改对象属性: b.name=‘小说‘ ③提交用户会话: db.session.commit() 查:①无条件查询:Book.query.查询执行器 ②条件查询:Book.query.过滤器.查询执行器 常用过滤器如下:
过滤器 |
说明 |
示例 |
filter(条件) |
返回符合该条件的查询集,BaseQuery对象 |
Book.query.filter(Book.id==1) |
filter_by() |
返回符合该等值条件的查询集 |
Book.query.filter_by(id=1) |
limit |
使用指定的值限定原查询返回的结果 |
|
offset() |
偏移原查询返回的结果,返回一个新查询集 |
|
order_by() |
根据字段进行排序,默认是正序,返回新查询集,desc可以反序 |
Book.query.order_by(Book.id) Book.query.order_by(Book.id.desc) |
group_by() |
根据字段进行分组,返回新查询集合 |
|
常用查询执行器如下:
方法 |
说明 |
示例 |
all() |
以列表形式返回查询的所有结果 |
Book.query.filter(Book.id==1).all() |
first() |
返回查询的第一个结果,如果未查到,返回None |
Book.query.filter(Book.id==1).first() |
first_or_404() |
返回查询的第一个结果,如果未查到,返回404 |
|
get() |
返回指定主键对应的行,如不存在,返回None |
Book.query.get(1) |
get_or_404() |
返回指定主键对应的行,如不存在,返回404 |
|
count() |
返回查询结果的数量 |
Book.query.count() |
paginate() |
返回一个Paginate对象,它包含指定范围内的结果,参数一:第几页,参数二:每页个数,参数3:如果没有该页数返回False |
Book.query.paginate(2,3,False) |
逻辑非,逻辑与,逻辑或 from sqlalchemy import not_,and_,or_ 示例:User.query.filter(not_(User.name==‘chen‘)).all() User.query.filter(and_(User.name!=‘wang‘,User.email.endswith(‘163.com‘))).all()
一对多,多对一关联查询 一对多:①先查询出一类对象,例如author=Author.query.get(1) ②根据我们设置的relationship属性获取这一类对象下的全部多类对象: books=author.books (即该作者下全部书籍) 多对一:①查询出多类对象,例如book=Book.query.get(2) ②根据我们设置的backref反向设置的属性获取该多类对象对应的一类对象: author =book.author (即这本书所属的作者)
flask数据库迁移 D:在数据库中建立模型类映射的数据库表,如果需要修改数据库模型,还要在修改之后更新数据库,最好的解决的方法使用数据库迁移框架Flask-Migrate E:建立相关数据库表,而且追踪数据库模式的变化,然后把变动应用到数据库中,还可以回退版本。 U:迁移步骤: ①安装扩展包:迁移扩展包:pip install flask-migrate,脚本管理器包:pip install flask-script ②导包:from flask_migrate import Migrate,MigrateCommand from flask_script import Shell,Manager ③创建脚本管理器:manager= Manager(app) ④迁移关联应用和数据库:Migrate(app,db) ⑤添加迁移命令道脚本管理器:manager.add_command(‘db‘,MigrateCommand) ⑥使用脚本命令在命令行进行迁移操作:
创建迁移文件夹 |
python xxx.py db init |
生成当前版本迁移文件 |
python xxx.py db migrate -m ‘版本说明‘ |
执行当前本迁移文件 |
python xxx.py db upgrade |
回退一个迁移版本 |
python xxx.py db downgrade |
查看迁移历史记录 |
python xxx.py db history |
向上迁移到指定版本 |
python xxx.py db upgrade 版本号 |
向下迁移到指定版本 |
python xxx.py db downgrade 版本号 |
查看当前迁移版本 |
python xxx.py db current |
|