【手把手教你-Python】如何让 Flask 根据现有表结构生成 SQLAlchemy 模型文件?

首先你要具备一定 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

注意以下两点:

  1. 它生成的模型类,字段注释参数是 info,我们使用的时候应该改为 comment,否则报错:AttributeError: ‘str‘ object has no attribute ‘copy‘;
  2. 索引的定义,要放到 __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

这是《手把手教你》系列文章,希望通过浅显易懂的文字,教会你如何做一件事情。后续我会结合实际工作,持续更新本文。

想了解我,去看看我的项目和作品

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值