首先你要具备一定 Python 基础,了解 Flask 框架,以及数据库工具 SQLAchemy。
为什么会有这个需求?
在使用 Python 编写项目代码时,假设数据库中的表已经存在,我们需要根据现有的表结构来编写 SQLAlchemy 模型文件。为了避免逐行编写代码,我们可以使用一个工具来“一键生成”模型文件,那就是 sqlacodegen。
准备工作
Python 版本:3.11.5(只要是 3.xx 版本应该都可以)
安装好 Python 相关软件包
pip install flask flask-sqlalchemy pymysql
安装本次需要用到的工具 sqlacodegen
pip install flask-sqlacodegen
sqlacodegen 会读取现有数据库的表结构,并使用声明式风格,生成相应的 SQLAlchemy 模型代码。
生成模型文件
flask-sqlacodegen mysql+pymysql://username:password@127.0.0.1:3306/db_xxx_testing?charset=utf8mb4 --outfile "all-table-models.py" --flask
如果数据库的密码包含特殊符号,例如 @,那么需要使用 url encode 转义后的字符串。
其中 db_xxx_testing 是数据库的名称。
--oufile 如果只指定文件名,工具会在当前目录下生成该文件。如果指定了其他路径,文件则会生成到指定的路径。
--flask 表示使用 Flask-SQLAlchemy 列的声明形式
--help 查看帮助文档
查看生成的模型文件,会看到类似这样的内容
# coding: utf-8
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class TblAdminUser(db.Model):
__tablename__ = 'tbl_admin_user'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, nullable=False, index=True, info='用户ID')
username = db.Column(db.String(150, 'utf8mb4_unicode_ci'), nullable=False, unique=True)
password = db.Column(db.String(150, 'utf8mb4_unicode_ci'), nullable=False)
create_time = db.Column(db.DateTime, nullable=False)
update_time = db.Column(db.DateTime)
将该文件的 db 变量,换成你项目中的 db 变量。或者拷贝相关类的代码到你原本的模型文件。
如果只想生成部分表的模型类,使用 --tables 参数,多个表用英文逗号分隔
flask-sqlacodegen mysql+pymysql://username:password@127.0.0.1:3306/db_xxx_testing?charset=utf8mb4 --tables user --outfile "common/models/User.py" --flask
注意以下两点:
- 它生成的模型类,字段注释参数是 info,我们使用的时候应该改为 comment,否则报错:AttributeError: ‘str‘ object has no attribute ‘copy‘;
- 索引的定义,要放到 __table_args__ 参数,否则生成迁移文件的时候,它有两个操作,删除索引,再重新创建。虽然最终效果一样,但没有必要这样做。而且生产环境,不能随意给数据库删除或添加索引。
__table_args__ = (
db.UniqueConstraint('open_id', name='idx_open_id'), # 唯一索引
db.Index('idx_union_id', 'union_id'), # 普通索引
)
集成到 Flask 应用
将生成的模型类集成到你的 Flask 应用中。假设你的 Flask 应用的主文件是 app.py
,你可以按照以下方式进行集成:
在 app.py
中配置 SQLAlchemy 和 Flask-Migrate:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@127.0.0.1:3306/db_xxx_testing?charset=utf8mb4'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
在 models.py
中导入 db
并将生成的模型类修改为使用 db
实例:
from app import db
# 生成的模型类会使用 `db.Model` 作为基类
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True) # 主键索引的定义,不用放到 __table_args__ 中
username = db.Column(db.String(64), comment='用户名')
email = db.Column(db.String(120))
__table_args__ = (
db.Index('idx_username', 'username '),
db.UniqueConstraint('email', name='idx_email'),
)
确保在 app.py
中导入模型:
from models import User
验证
启动 Flask 应用,没有报错则表示一切正常
flask run
这是《手把手教你》系列文章,希望通过浅显易懂的文字,教会你如何做一件事情。后续我会结合实际工作,持续更新本文。
想了解我,去看看我的项目和作品。