【MySQL入门】(五)Flask使用MySQL存储数据

本文基于MySQL 8.0.29 和 Python 3.8。

1. flask_sqlalchemy简介

Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展,也是一种数据库框架,支持多种数据库后台。它致力于简化在 Flask 中 SQLAlchemy 的使用,提供了有用的默认值和额外的助手来更简单地完成常见任务。无须关心SQL处理细节,通过调用方法操作数据库。这是flask_sqlalchemy的中文文档

2. 安装pymysql,sqlalchemy,flask_sqlalchemy

pip install pymysql sqlalchemy flask_sqlalchemy

3. 配置一个简单的Flask应用

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://{}:{}@{}/{}?charset=utf8mb4" \
										.format('root','密码','x.x.x.x:3306','数据库名')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True  # 每次请求结束后会自动提交数据库中的变动
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True  # 事件系统跟踪修改
db = SQLAlchemy(app)  # 实例化数据库对象,它提供访问Flask-SQLAlchemy的所有功能

4. 定义一个类(对应数据库中的表)

class Myuser(db.Model):  # 所有模型的基类叫 db.Model,它存储在创建的SQLAlchemy实例上。
    #定义表名
    __tablename__ = 'myuser'
    #定义字段
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=False)
    money = db.Column(db.Float, unique=False)

    #__repr__()方法显示一个可读字符串,用于调试、测试
    def __repr__(self):
        return '<Myuser id:{} name:{} money:{}>'.format(self.id,,self.money)

这是一个简单的实例:

flask mysql插入 flask配置mysql_flask mysql插入


常见的 SQLalchemy 列类型

类型名称

python类型

描述

Integer

int

常规整形,通常为32位

SmallInteger

int

短整形,通常为16位

BigInteger

int 或 long

精度不受限整形

Float

float

浮点数

Numeric

decimal.Decimal

定点数

String

str

可变长度字符串

Text

str

可变长度字符串,适合大量文本

Unicode

unicode

可变长度Unicode字符串

Boolean

bool

布尔型

Date

datetime.date

日期类型

Time

datetime.time

时间类型

Interval

datetime.timedelta

时间间隔

Enum

str

字符列表

PickleType

任意Python对象

自动Pickle序列化

LargeBinary

str

二进制

常见的 SQLalchemy 列选项

可选参数

描述

primary_key

如果设置为True,则为该列表的主键

unique

如果设置为True,该列不允许相同值

index

如果设置为True,为该列创建索引,查询效率会更高

nullable

如果设置为True,该列允许为空。如果设置为False,该列不允许空值

default

定义该列的默认值

5. 删除、创建数据表

下面的操作将对数据库中的所有表产生影响:

# 删除旧表:
db.drop_all() 
# 创建新表:
db.create_all()

6. 数据库的增删改查

1.增

user_A = Myuser(id=123, name='user_A', money=66.66)
user_B = Myuser(id=456, name='user_B', money=888.88)
#在将对象写入数据库之前,先将其添加到会话中(类似缓存)
# 插入单个对象
# db.session.add(user_A)
# 插入多个对象
db.session.add_all([user_A, user_B])
#会话提交到数据库后执行操作
db.session.commit()

结果:

flask mysql插入 flask配置mysql_数据库_02

2. 删

db.session.delete(user_B)
db.session.commit()

结果:

flask mysql插入 flask配置mysql_python_03

3. 改

user_A.name = 'somebody'
user_A.money= 999
db.session.add(user_A)
db.session.commit()

结果:

flask mysql插入 flask配置mysql_python_04

4. 查

Myuser.query.filter_by(id = 123).first()
Myuser.query.filter_by(name = 'somebody').all()

flask mysql插入 flask配置mysql_数据库_05


常用的SQLAlchemy查询过滤器

过滤器

说明

filter()

把过滤器添加到原查询上,返回一个新查询

filter_by()

把等值过滤器添加到原查询上,返回一个新查询

limit

使用指定的值限定原查询返回的结果

offset()

偏移原查询返回的结果,返回一个新查询

order_by()

根据指定条件对原查询结果进行排序,返回一个新查询

group_by()

根据指定条件对原查询结果进行分组,返回一个新查询

常用的SQLAlchemy查询执行器

方法

说明

all()

以列表形式返回查询的所有结果

first()

返回查询的第一个结果,如果未查到,返回None

first_or_404()

返回查询的第一个结果,如果未查到,返回404

get()

返回指定主键对应的行,如不存在,返回None

get_or_404()

返回指定主键对应的行,如不存在,返回404

count()

返回查询结果的数量

paginate()

返回一个Paginate对象,它包含指定范围内的结果