目录
3.3SQLALCHEMY_TRACK_MODIFICATIONS
前言
本次使用的Flask-SQLAlchemy版本为3.1,因此可能新增部分特性,建议大家还是使用新版本吧,所谓用新不用旧
官方文档:Flask-SQLAlchemy — Flask-SQLAlchemy Documentation (3.1.x)
一.Flask-SQLAlchemy的安装
使用pip安装
pip install Flask-SQLAlchemy
导入Flask-SQLAlchemy
注意,此时导入的时候与pip安装的名称略有不同:“字符全部为小写,且-变为_”
from flask_sqlalchemy import *
二.构建DB对象
2.1什么是DB对象
在我们使用flask-sqlalchemy时,需要通过构造函数实例化一个db对象,之后对数据库的操作都基于这个db对象,可以理解为这个db对象就是主机与数据库的“一条链接”
2.2构建DB对象
flask-sqlalchemy通过“SQLAlchemy()”构造函数来构建db对象,例如下面构建了一个db对象
from flask-sqlalchemy import SQLAlchemy
db = SQLAlchemy()
SQLAlchemy内还有参数,在这里不做解释,感兴趣的可以查找官方文档
2.3DB对象与Flask实例关联
当我们构建一个db对象时,我们还需要将这个db对象与Flask实例关联,并且通过配置Flask中的参数来配置db对象的扩展,如果db对象不与一个Flask实例关联,那么该db对象将是“无效的”
将db对象与Flask实例关联有两种方法:“在构建db对象时将Flask实例作为参数传入”、“后续使用init_app()函数关联”
将Flask实例作为参数传入
from flask import Flask
from flask-sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
使用init_app()函数关联
from flask import Flask
from flask-sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy()
#一些操作#
db.init_app(app)
三.配置DB对象的扩展
db对象的扩展通过修改flask实例的config属性来修改
db对象常用的扩展键有如下:
3.1SQLALCHEMY_DATABASE_URI
用于连接数据库的URL,可是字符串或SQLAlchemy实例。
一个URL例子:mysql+pymysql://scott:tiger@localhost/foo
URL由下面几部分组成:
- 数据库种类(MySQL、Oracle等等)+在python中对应的DBAPI(pymysql、mysqldb等等)[DBAPI可以省略此时就有SQLAlchemy用默认配置]:mysql+pymysql
- 分隔符“://”
- 用户名:密码
- 分隔符:“@”
- 数据库地址,例如:“localhost”
- 分隔符:“/”
- 数据库名称:例如在MySQL中我有“stu”、“test”、“foo”三个数据库,这里指的是数据库名字
3.2SQLALCHEMY_ECHO
用于在Python解释器中打印SQLAlchemy发出的连接和查询信息,便与调试
启用方法:SQLALCHEMY_ECHO = True,默认为False(关闭)
3.3SQLALCHEMY_TRACK_MODIFICATIONS
该选项用来控制db对象与数据库的数据保持一致,默认情况下为False关闭,如果设置为True,在我们对数据库进行更新后,db对象中的(缓存)数据也会进行动态的更新,从而保持与数据库的数据一致性
启用方法:SQLALCHEMY_TRACK_MODIFICATIONS = True
四.定义模型model
4.1模型model的作用
定义模型之后,我们可以很方便的创建模型对象,之后再对数据库进行操作时,便可使用模型对象操作,大大简化了书写提高了效率
除此之外,使用模型我们还可以很方便的创建一张或多张表
4.2定义格式
创建一个类,该类必须继承db对象的Model模型, 之后可以编辑这个类,“__tablename__”属性用来标识该模型的名字(创建表时的名字),如果没有指定将有flask-sqlalchemy随机指定
我们使用db.Column()方法来创建表中的一列
class User(db.Model):
#设置表名
__tablename__ = 'myuser'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(128))
text = db.Column(db.TEXT)
create_time = db.Column(db.String(64))
一些参数说明:
- primary_key = True:主键(True表示主键,False表示不是主键)
- autoincrement = True:自动递增
- unique = True:唯一标识
- nullable = True:允许空值,False不允许空值
4.3db.Column(数据类型)
-
Integer:整数类型,对应MySQL里的int
-
String(Size):字符串类型,对应MySQL里的varchar(Size)
-
Text:长文本类型,对应MySQL里的text
-
DateTime:日期类型,对应MySQL里的datetime
-
Float:浮点数类型,对应MySQL里的float
-
Boolean:布尔类型,对应MySQL里的boolean
-
PickleType:存储为一个持久化的Python对象
-
LargeBinary:存储一个任意大的二进制数据
4.4使用db模型创建db模型对象
在创建好db模型之后,我们就可以创建db模型对象,之后可以对这个db模型对象进行操作,最后再将该模型提交即可实现数据库操作
import time
from flask_sqlalchemy import SQLAlchemy
from flask import *
app = Flask(__name__)
db = SQLAlchemy(app)
class User(db.Model):
#设置表名
__tablename__ = 'myuser'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(128))
text = db.Column(db.TEXT)
create_time = db.Column(db.String(64))
create_time = time.strftime("%Y-%m-%d %H:%M:%S")
user = User(id=1,titile="Niubi",text="a4s56d46",create_time=create_time)
db.session.add(user)
db.session.commit()
该代码向数据库中的“myuser”表插入了一条“(1,"Niubi","a4s56d46","当前时间")”的记录
4.5使用db模型创建/删除数据表
代码如下:
#该操作将创建db对象下的所有模型类
db.create_all()
#例如我有两个模型类:“User”、“Study”,那么将会创建这两张表
不过该代码一般情况下无法运行,会出现报错,此时我们只需要添加“上下文关系”即可:
with app.app_context():
db.create_all()
有创建就有删除,我们也可以使用“db.drop_all()”一次性删除数据库中的所有表
with app.app_context():
db.drop_all()
五.插入、更新、删除数据
值得注意的是,在我们“插入、更新、删除数据”后,都应该使用“db.commit()”方法来提交操作,否则数据库将会丢失操作!!!
5.1插入数据
在flask-sqlalchemy中,插入数据我们需要使用model模型,通过构造模型对象、插入模型对象的方式,实现插入数据
例如:
import time
from flask_sqlalchemy import SQLAlchemy
from flask import *
app = Flask(__name__)
db = SQLAlchemy(app)
class User(db.Model):
#设置表名
__tablename__ = 'myuser'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(128))
text = db.Column(db.TEXT)
create_time = db.Column(db.String(64))
create_time = time.strftime("%Y-%m-%d %H:%M:%S")
user = User(id=1,titile="Niubi",text="a4s56d46",create_time=create_time)
db.session.add(user)
db.session.commit()
5.2更新数据
更新数据,只需要对模型对象进行更改,再提交操作即可
例如:
#获取目标模型(记录)
user = User.query.filter(User.id == 1).first()
#修改值
user.id = 2
#提交操作
db.session.commit()
5.3删除数据
删除数据,需要使用“db.session.deleter()”方法删除模型对象,再提交操作即可
#查找目标模型(记录)
target_user = User.query.filter(User.id == 1).first()
#删除模型
db.session.delete(target_user)
#提交操作
db.session.commit()