引言 本文将介绍在Flask中使用第三方库“flask_sqlalchemy”进行操作数据库。 官方文档

image.png

1.安装flask_sqlalchemy

  1. pipenv install flask_sqlalchemy pymysql

2.常用方法

1.Flask配置

1.Flask配置文件操作

在Flask的配置文件(flaskConfig.py)中对“Flask-sqlalchemy”进行“数据库连接”、“打印输出执行的SQL语句”等

  1. # 下面是关键配置
  2. # 使用pymysql驱动进行数据库连接配置
  3. SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{user}:{password}@{host}:{port}/{database}?charset=utf8'
  4. # 是否显示底层执行的SQL语句【True-->显示-->有利于debug;(默认)False-->不显示】
  5. SQLALCHEMY_ECHO = False
  6. #设置每次请求结束后会自动提交数据库中的改动,一般都设置手动保存,Ture表示自动保存
  7. SQLALCHEMY_COMMIT_ON_TEARDOWN=True
  8. # 是否追踪对象的修改并发送信息【(默认)True-->需消耗内存;【建议--》Fasle】】
  9. SQLALCHEMY_TRACK_MODIFICATIONS = False
  10. #数据库连接池的大小,。默认5
  11. SQLALCHEMY_POOL_SIZE=10
  12. #设置数据库--自动回收连接
  13. SQLALCHEMY_POOL_RECYCLE = 500
  14. # TRAP_BAD_REQUEST_ERRORS = True
  15. #设定连接池的连接超时时间。默认是 10 秒
  16. SQLALCHEMY_POOL_TIMEOUT=20

2.实例化db对象

  1. # 此示例展示:最小代码结构
  2. import resource.flaskConfig as FlaskConfig # 导入flask的配置文件,并设置别名:FlaskConfig
  3. from flask import Flask
  4. from flask_sqlalchemy import SQLAlchemy # 导入SQLAlchemy类对象
  5. app = Flask(__name__) # 实例化Flask对象
  6. app.config.from_object(FlaskConfig) # 加载flask的配置文件
  7. db = SQLAlchemy(app) # 初始化db对象

2.基本操作

1.创建—模型与表映射

在flask-sqlalchemy中,创建一张数据库表(table),需要继承db.Models,并且【关键执行:db.create_all() 】,示例如下所示:

1.属性参数介绍
属性值 说明 备注
db.Integer 整数
db.String(长度) (可变/不可变)字符
db.Text 文本
primary_key 主键 primary_key=True
autoincrement 自增 autoincrement=True
nullable 是否为空 nullable=False
default 默认值

2.代码实现
  1. # 创建一张表【创建模型-->db.Model;表属性的映射-->db.Column()】
  2. class Plan(db.Model):
  3. __tablename__ = 'plan' # 设置表名, 表名默认为类名小写
  4. id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 设置主键, 默认自增
  5. name = db.Column(db.String(20), nullable=False) # 设置字段名 和 不为空
  6. taskNumber= db.Column(db.Integer, default=10, nullable=False) # 设置默认值
  7. class project(db.Model):
  8. pass
  9. db.create_all() # 创建表和数据库

image.png

2.新增(insert)

在flask-sqlalchemy中的“增加(insert)”操作,最后需要借助db.session.add(新增的数据)来实现

1.执行操作流程图

1.【基础】Flask-Sqlalchemy操作数据库 - 图4

2.代码实现
  1. @app.route("/api/ops")
  2. def insertOps():
  3. # 增加
  4. plan = Plan(name="软件测试计划-9月", taskNumber=130)
  5. db.session.add(plan) # session(用于增删改)
  6. print("新增数据成功")
  7. # db.session.commit() # 提交事务操作【当flask配置文件中设置commit=True,则可注释此行】

image.png

3.查询(select)

在flask-sqlalchemy中的“查询(select)”操作,最后需要借助Model.query.filter(key=value).first/all来实现,最终返回Model的id(即表数据id)。

1.执行操作流程图

1.【基础】Flask-Sqlalchemy操作数据库 - 图6

2.代码实现
  1. @app.route("/api/ops")
  2. def insertOps():
  3. # 查询
  4. # select * from plan where plan.name = '软件测试计划-7月'
  5. resID=Plan.query.filter(Plan.name == '软件测试计划-7月').first() # first()-->查询第一匹配的数据,并返回数据的id
  6. print("表数据id=\t",resID)
  7. print("taskNumber字段数据\t",resID.taskNumber)

image.png

4.删除(delete)

在flask-sqlalchemy中的“删除(delete)”操作,需要通过select查询到id,然后通过db.session.delete(id)来实现

1.执行操作流程图

1.【基础】Flask-Sqlalchemy操作数据库 - 图8

2.代码实现
  1. @app.route("/api/ops")
  2. def insertOps():
  3. # 删除
  4. resID=Plan.query.filter(Plan.name == '软件测试计划-7月').first() # first()-->查询第一匹配的数据,并返回数据的id
  5. print("表数据id=\t",resID)
  6. if resID is not None:
  7. db.session.delete(resID) # 【执行】数据删除操作
  8. else:
  9. print("无可删除的数据")

5.更新(update)

在flask-sqlalchemy中的“删除(delete)”操作,需要通过select查询到id,然后通过db.session.delete(id)来实现

1.执行操作流程图

1.【基础】Flask-Sqlalchemy操作数据库 - 图9

2.代码实现
  1. @app.route("/api/ops")
  2. def insertOps():
  3. # 更新
  4. resID = Plan.query.filter(Plan.name == '软件测试计划-6月').first() # first()-->查询第一匹配的数据,并返回数据的id
  5. print("表数据id=\t", resID)
  6. if resID is not None:
  7. # 【执行】数据更新操作
  8. resID.name = "update-软件测试计划-6月"
  9. resID.taskNumber = 2022
  10. # db.session.commit() # 提交事务操作【当flask配置文件中设置commit=True,则可注释此行】
  11. print("数据更新成功")
  12. else:
  13. print("无可更新的数据")

3.扩展

1.or

在flasksqlalchemy中使用【sql】or,**需要导包“from sqlalchemy import or, and_”**,具体实现如下所示:

  1. #【step1】导包
  2. from sqlalchemy import or_, and_ # 进行【select where or】的查询
  3. #【step1】 or的使用
  4. resCount = User.query.filter(or_(User.username == username, User.email == email, User.phone == phone)).count()

image.png