PythonWeb开发框架—Flask框架之flask-sqlalchemy、序列化和反序列化使用详解

发布于:2025-03-10 ⋅ 阅读:(15) ⋅ 点赞:(0)

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 时生成的迁移脚本的结构和格式

flask db migrate 

根据定义表模型的脚本变化,自动生成迁移脚本.py文件,脚本存放在migrations/versions下,脚本里包含应用变更upgrade()和 回滚变更downgrade()函数

flask db upgrade

执行所有未应用的迁移脚本中的upgrade()函数,实际操作数据库,完成创建表和新增表字段的操作,或者其他表结构变更的操作同时在数据库中也会创建一个alembic_version表, 用来记录当前版本号

数据回滚操作

flask db history   #查找版本号

flask db downgrade <版本号>   #回滚到指定版本

5.数据库操作

5.1 新增表

重新定义一个表模型,执行flask db migrate 和flask db upgrade即可

5.2 新增字段

直接在表模型类下添加字段,执行flask db migrate 和flask db upgrade即可

5.3 插入数据

先实列化表模型类,然后执行:db.session.add()和db.session.commit()

举例说明

脚本内容

调用接口

数据库里检查数据落库情况

5.4 查询数据

查询所有,返回值是对象:表模型类.query.all()

根据主键查询,返回值是对象:表模型类.query.get(主键)

返回第一条,返回值是对象:表模型类.query.first()

加简单条件查询,返回值是对象:表模型类.query.filter_by().all()

加复杂条件查询,返回值是对象:表模型类.query.filter().all()

查询某个字段的所有数据,返回值是具体的值:db.session.query(模型类.字段).all()

注:在没有反序列化前,输出的值前端不能展示

5.5 修改数据

修改一条数据的某个字段:

批量修改:

5.6 删除数据

删除一条数据:先查询,在删除

删除多条数据:直接执行delete()

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()

为什么要重构load():因为直接使用默认load()出来的还是原始字典,不是python对象,在db.session.add_all()时会报错。

序列化操作

视图函数:

from flask import  request

@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 '序列化成功'

前端调用:

数据库检查:

反序列操作

视图函数:

from flask import  jsonify, 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)

前端调用: