Flask数据库

D:使用扩展包flask-sqlalchemy来操作数据库(增删改查)

E:通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升

U:常用的SQLAlchemy字段类型

flask sqlalchemy 操作redis flask sqlalchemy教程_sqlalchemy


常用的SQLAlchemy列选项

flask sqlalchemy 操作redis flask sqlalchemy教程_sqlalchemy_02


常用的SQLAlchemy关系选项

flask sqlalchemy 操作redis flask sqlalchemy教程_sqlalchemy_03


①安装扩展包及导包

安装flask-sqlalchemy:pip install flask-sqlalchemy

如果连接的是mysql数据,需安装mysqldb:pip install flask-sqlalchemy

导包:from flask_sqlalchemy import SQLAlchemy

②配置相关数据库的设置

#数据库信息设置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1: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.过滤器.查询执行器

常用过滤器如下:

flask sqlalchemy 操作redis flask sqlalchemy教程_flask_04


常用查询执行器如下:

flask sqlalchemy 操作redis flask sqlalchemy教程_flask_05

逻辑非,逻辑与,逻辑或
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)

⑥使用脚本命令在命令行进行迁移操作:

flask sqlalchemy 操作redis flask sqlalchemy教程_flask_06