PythonWeb开辟框架—Flask框架之flask-sqlalchemy、序列化和反序列化使用详
1.安装依靠库pip install flask-sqlalchemy
pip install pymysql
2.连接数据库配置
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)#创建 Flask 应用实例
#配置数据库连接
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:study123@127.0.0.1:3306/testdevelop?charset=utf8mb4'
db=SQLAlchemy()#创建 SQLAlchemy 实例
db.init_app(app)#将 db 实例与 Flask 应用绑定,激活数据库功能
3.定义表模子
#定义表模型
class TaskTest(db.Model):
#手动定义表名, 否则默认为小写的类名
__tablename__ ='task_test'
#定义自增主键字段,格式为: 字段名 = db.Column(db.类型, 附加属性[主键/唯一性等])
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
#定义唯一,且不能为空的字段
iphonenumber=db.Column(db.String(15), unique=True, nullable=False)
name = db.Column(db.String(128)) 常见的表字段范例:
db.Integer 整数范例
db.Float 浮点数
db.String(length) 字符串范例,需指定长度
db.Boolean 布尔值
db.DateTime 时间,精确到秒
db.Date 日期,格式:年-月-日
db.Text 长文本范例,无长度限定
db.Column()里其他参数介绍:
primary_key 默认值为false,设置为true时,表现为表的主键
autoincrement 默认值为false,设置为True时,通常与primary_key一起使用,表现该字段是一个自增的主键
unique 默认值为false,设置为true时,表现该字段数据值唯一,不可重复
default 字段的默认值,可以是常量、变量、表达式
nullable 是否答应为空,默认值为True,表现答应为空
index 默认值false,设置为True表现该字段会被创建索引
foreign_key 表现该字段是一个外键,指向另一个表的主键,值=另一个表表名.字段名
server_ts 设置为true表现服务器会维护该字段的创建时间戳,通常用于审计和日志记录
4.数据迁移
定义表模子后,需要用flask-migrate完成对数据库实际的操作,步调如下:
安装数据迁移同步工具:
pip install flask_migrate
导入模块:
from flask_migrate import Migrate
创建数据库迁移对象:
migrate = Migrate(app, db)
完整脚本如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)#创建 Flask 应用实例
#配置数据库连接
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:study123@127.0.0.1:3306/testdevelop?charset=utf8mb4'
db=SQLAlchemy()#创建 SQLAlchemy 实例
db.init_app(app)#将 db 实例与 Flask 应用绑定,激活数据库功能
migrate = Migrate(app, db) #创建数据库迁移对象 Terminal里依次实行命令:
flask db init
flask db migrate
[*]flask db upgrade
三条指令的解释:
flask db init
该条命令一个项目实行一次即可,它的作用是创建存储迁移脚本的migrations目录。migrations目录下包罗:
[*]versions文件夹:用来存放每次的迁移脚本
[*]alembic.ini:迁移工具Alembic的配置文件
[*]env.py:定义连接数据库的脚本
[*]script.py.mako:是Alembic迁移脚本模板文件,用于定义每次实行 flask db migrate 时天生的迁移脚本的布局和格式
https://i-blog.csdnimg.cn/direct/9de1d9ddc9ea4abc89bec35394a54b42.png
flask db migrate
根据定义表模子的脚本变化,主动天生迁移脚本.py文件,脚本存放在migrations/versions下,脚本里包罗应用变更upgrade()和 回滚变更downgrade()函数
https://i-blog.csdnimg.cn/direct/f4195c994b1149cebc85f62bcf72c00d.png
flask db upgrade
实行所有未应用的迁移脚本中的upgrade()函数,实际操作数据库,完成创建表和新增表字段的操作,或者其他表布局变更的操作,同时在数据库中也会创建一个alembic_version表, 用来记录当前版本号
https://i-blog.csdnimg.cn/direct/1eb1994f3b9e4e8e88729aaa8d7eed37.png
数据回滚操作:
flask db history #查找版本号
flask db downgrade <版本号> #回滚到指定版本
5.数据库操作
5.1 新增表
重新定义一个表模子,实行flask db migrate 和flask db upgrade即可
https://i-blog.csdnimg.cn/direct/4297eed5c2184e01860026396b8fe763.png
5.2 新增字段
直接在表模子类下添加字段,实行flask db migrate 和flask db upgrade即可
https://i-blog.csdnimg.cn/direct/52beeee5bc7c4c97af7dcbdee3e18cc7.png
5.3 插入数据
先实列化表模子类,然后实行:db.session.add()和db.session.commit()
举例说明:
脚本内容:
https://i-blog.csdnimg.cn/direct/ac49b24d5680486e82a22b8be61655f7.png
调用接口:
https://i-blog.csdnimg.cn/direct/a8c0ea08df854d4c9e1ea0f359e1ce58.png
数据库里查抄数据落库情况:
https://i-blog.csdnimg.cn/direct/fef24fb272a148af9b6bb688439edbd0.png
5.4 查询数据
查询所有,返回值是对象:表模子类.query.all()
https://i-blog.csdnimg.cn/direct/299a00c3ea0f4a35828df0c12a37a16d.png
根据主键查询,返回值是对象:表模子类.query.get(主键)
https://i-blog.csdnimg.cn/direct/bccf2b7ef9864e5f834a2a90677bdf07.png
返回第一条,返回值是对象:表模子类.query.first()
https://i-blog.csdnimg.cn/direct/3438a6b34bef4a9588d1892ce64b9732.png
加简单条件查询,返回值是对象:表模子类.query.filter_by().all()
https://i-blog.csdnimg.cn/direct/859a4e84be054c23a5e624a77b25d3b1.png
加复杂条件查询,返回值是对象:表模子类.query.filter().all()
https://i-blog.csdnimg.cn/direct/84d0d09e11a740db8adadb5ed343cc3b.png
查询某个字段的所有数据,返回值是详细的值:db.session.query(模子类.字段).all()
https://i-blog.csdnimg.cn/direct/1b68516802394e618560872d17dcf6bc.png
注:在没有反序列化前,输出的值前端不能展示
5.5 修改数据
修改一条数据的某个字段:
https://i-blog.csdnimg.cn/direct/2069781273d6476d8b0b4494b11200e8.png
https://i-blog.csdnimg.cn/direct/bf849d23beda47fd982ee859850cf20d.png
批量修改:
https://i-blog.csdnimg.cn/direct/d2aa6272459f47e1819f44859fa2fb18.png
https://i-blog.csdnimg.cn/direct/b4e3fffad1e340c18ba1cca046400304.png
5.6 删除数据
删除一条数据:先查询,在删除
https://i-blog.csdnimg.cn/direct/4139d3a2ce2840eaa2757e87acbe6965.png
删除多条数据:直接实行delete()
https://i-blog.csdnimg.cn/direct/735cf0ca4308483a968fa725727d0c70.png
6.序列化和反序列化
序列化:把前端数据转化为python对象,通过 Python脚本添加到数据库
反序列化:把Python对像转化为前端要的json格式
安装依靠库:
pip install flask-marshmallow
pip install marshmallow-sqlalchemy
导入模块
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
from marshmallow import post_load
构造模子器:
class TaskInfoSchema(SQLAlchemyAutoSchema):
class Meta:#固定写法:Meta
model=TaskInfo()#定义表task_info的类名
fields=['taskname','device_list']#多个字段放在一个列表中 序列化器:重构load()
https://i-blog.csdnimg.cn/direct/a52e8ba9dd3d4de995491a509b4b0f36.png
为什么要重构load():因为直接使用默认load()出来的照旧原始字典,不是python对象,在db.session.add_all()时会报错。
序列化操作:
视图函数:
from flask importrequest
@app.route('/loaddata',methods=['GET','POST'])
def loaddata():
task_info_list=request.json.get("data")
task_info=TaskInfoSchema()
add_task_info=task_info.load(task_info_list,many=True)
print(add_task_info)
return '序列化成功' 前端调用:
https://i-blog.csdnimg.cn/direct/a2306e2b86dd4a51b0a2024db9f72d9c.png
数据库查抄:
https://i-blog.csdnimg.cn/direct/f813ee6a30864212bf8c8b127b5d7b44.png
反序列操作:
视图函数:
from flask importjsonify, make_response
@app.route('/dumpdata')
def dumpdata():
all_records=TaskInfo.query.all()
json_data=TaskInfoSchema().dump(all_records,many=True)#多条数据要加many=True
return make_response(jsonify(data=json_data), 200) 前端调用:
https://i-blog.csdnimg.cn/direct/03b619cec72546acba563e612e2f4c7b.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]