使用 sqlacodegen 反向生成 SQLAlchemy 模型代码

news/2025/4/1 18:14:58/文章来源:https://www.cnblogs.com/linsuiyuan/p/18800835

介绍

sqlacodegen 是一款能够读取现有数据库结构并生成相应的 SQLAlchemy 模型代码的工具。目前支持 SQLAlchemy 2.x,能识别关系类型(包括多对多、一对一),能自动检测表继承等。

安装

sqlacodegen 的安装命令如下:

pip install sqlacodegen

截至目前, sqlacodegen 的版本是 3.0.0。

示例

使用 sqlacodegen 命令,最基本的是要传给它一个数据库 URL。

示例:

sqlacodegen postgresql:///some_local_db
sqlacodegen --generator tables mysql+pymysql://user:password@localhost/dbname
sqlacodegen --generator dataclasses sqlite:///database.db

下面使用一个简单的 user 表来演示 sqlacodegen 命令的使用。user 表的数据库是 MySQL,有三个字段,分别是 id、username 和 password。其中 id 是主键字段,username 和 password 是用户名和密码,且都不能为 null,同时 username 具有唯一索引。

user 表结构如下所示:

类型 长度 不是 null 注释
id int 🔑 主键
username varchar 20 用户名
password varchar 32 密码

使用 sqlacodegen 命令前,需要安装 pymysql 这个 MySQL 数据库驱动包,命令如下:

pip install pymysql

目前 pymysql 的版本是 1.1.1。

接下来就可以使用 sqlacodegen 命令反向生成 ORM 模型类了,命令如下:

sqlacodegen mysql+pymysql://user:password@localhost/test --outfile user.py

生成的 user.py 文件的代码如下:

from sqlalchemy import Index, Integer
from sqlalchemy.dialects.mysql import VARCHAR
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_columnclass Base(DeclarativeBase):passclass User(Base):__tablename__ = 'user'__table_args__ = (Index('username', 'username', unique=True),)id: Mapped[int] = mapped_column(Integer, primary_key=True, comment='主键')username: Mapped[str] = mapped_column(VARCHAR(20), comment='用户名')password: Mapped[str] = mapped_column(VARCHAR(32), comment='密码')

通用选项

使用 sqlacodegen --help 命令可以查看 sqlacodegen 命令的通用选项,其输出如下所示:

usage: sqlacodegen [-h] [--options OPTIONS] [--version] [--schemas SCHEMAS] [--generator {dataclasses,declarative,sqlmodels,tables}][--tables TABLES] [--noviews] [--outfile OUTFILE][url]Generates SQLAlchemy model code from an existing database.positional arguments:url                   SQLAlchemy url to the databaseoptions:-h, --help            show this help message and exit--options OPTIONS     options (comma-delimited) passed to the generator class--version             print the version number and exit--schemas SCHEMAS     load tables from the given schemas (comma-delimited)--generator {dataclasses,declarative,sqlmodels,tables}generator class to use--tables TABLES       tables to process (comma-delimited, default: all)--noviews             ignore views (always true for sqlmodels generator)--outfile OUTFILE     file to write output to (default: stdout)

相应的中文翻译如下所示:

用法: sqlacodegen [-h] [--options OPTIONS] [--version] [--schemas SCHEMAS] [--generator {dataclasses,declarative,sqlmodels,tables}][--tables TABLES] [--noviews] [--outfile OUTFILE][url]从现有数据库生成 SQLAlchemy 模型代码。位置参数:url                   数据库URL选项:-h, --help            显示帮助信息--options OPTIONS     传递给生成器类的选项(逗号分隔)--version             输出版本号--schemas SCHEMAS     从指定模式加载表(逗号分隔)--generator {dataclasses,declarative,sqlmodels,tables}使用的生成器--tables TABLES       要处理的表(逗号分隔,默认:全部)--noviews             忽略视图(sqlmodels 生成器始终忽略视图)--outfile OUTFILE     输出到文件(默认:标准输出)

生成器(generator)

生成器(generator)介绍

生成器是 sqlacodegen 的核心选项,用于指定代码生成逻辑的类型。不同的生成器会输出不同风格的 SQLAlchemy 模型代码,适用于不同的开发场景。通过 --generator 参数选择生成器。

sqlacodegen 内置的生成器包括:

  • tables (仅生成 Table 对象)
  • declarative (默认,生成继承自 declarative_base() 的类)
  • dataclasses (生成基于数据类的模型,仅限 v1.4+)
  • sqlmodels (生成 SQLModel 模型类)

生成器专属选项

通过 --options 指定(多个值用逗号分隔):

  • tables

    • noconstraints: 忽略约束(外键、唯一约束等)

    • nocomments: 忽略注释

    • noindexes: 忽略索引

  • declarative

    • 继承 tables 所有选项

    • use_inflect: 自动将复数表名转换为单数类名(如 usersUser)。

    • nojoined: 禁用表继承检测

    • nobidi: 仅生成单向关系(不生成反向关系属性)。

  • dataclasses

    • 继承 declarative 所有选项
  • sqlmodels

    • 继承 declarative 所有选项

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908200.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025全国青少年信息素养大赛报名指南(内附报名全流程)

2025全国青少年信息素养大赛报名指南 (内附报名全流程)2025 年预估初赛在 28 万~32 万人次左右,今年竞争会比较激烈,大家提前备考,NOI官网发布了“关于参加CSP-J/S认证需符合年龄条件的公告”,报名参加CSP-J/S的被认证者在当年9月1日(不含)需满12周岁,包括第一轮和第…

Codeforces Round 1013 (Div. 3)(前5)

比赛链接 A:Olympiad Date 让我们开始一个数字计数器 cnt[i] ( 0≤i≤9) 3≤cnt[0],1≤cnt[1],2≤cnt[2], 1≤cnt[3],1≤cnt[5] 答案已找到。如果在计算所有数字之后,没有满足其中一个条件,则没有解决方案,答案为 0. 代码如下 #include <bits/stdc++.h> using namesp…

【题解】E - Replace

背景 这把报了 UnRated 从 E 开始看,于是非常惨烈的只拿下了 E。这个 2054 难度的题居然只有绿。E - Replace 题意 给你两个字符串 \(s,t\),你每次可以把 \(s\) 中的一种字符换成另一种,求把 \(s\) 变成 \(t\) 的最小操作数,可能无解。 思路 我们先考虑无解怎么判:可以得到…

质数筛——欧拉筛

欧拉筛 核心思想 和数只被它最小的质因数筛去 prime_number是当前小于i的所有质数集合 p是prime_number的元素,当没有找到最小质因数pi时,p是j的最小质因数,j可以被筛去,当找到最小质因数时就要退出循环,否则不能保证p是j的最小质因数 算法的时间复杂度:O(n),到n的所有和…

索引的分类

远离那些贬低你理想的人。狭隘的人经常如此,伟大的人会让你感觉自己也可以变好。 ——马克吐温按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引) 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀…

Linux基本使用-3

常用快捷键使用ctrl + c ==> 强制停止,结束当前命令运行或清空已输入命令ctrl + d ==> 退出登出,退出当前登录账户或退出程序history ==> 查看历史命令!命令前缀 ==> 自动匹配上一个命令ctrl + r ==> 搜索历史命令ctrl + a|e ==> 光…

评论夸一夸功能

评论夸一夸功能原文:https://www.tianyubk.com/863.html效果图1. 新建CSS文件 ​项目根目录/resouces/插件/小工具/评论​ (可以新建上述目录)新建 kuakua.css​ 文件 .kuakua-first-box {margin: auto;width: 440px;border-radius: 16px;bottom: auto;min-height: 10rem;le…

执行一条SQL请求的过程

远离那些贬低你理想的人。狭隘的人经常如此,伟大的人会让你感觉自己也可以变好。 ——马克吐温大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如…

pikachu-RCE

exec "ping" 注入方式和DVWA靶场 - Command Injection一致 exec "evel"通过代码可以看出用户输入的信息未经过任何过滤被直接执行 尝试传入phpinfo();

位运算的操作

代码展示: #include <iostream> using namespace std;int main() {int n, m;cin >> n >> m;while (m--) {int op;cin >> op;if (op == 1) {int x;cin >> x;cout << ((n >> x) & 1) << endl;} else if (op == 2) {int l, …

将本地代码上传至github进行代码管理

博客地址:https://www.cnblogs.com/zylyehuo/

从静态报表到动态大屏

在当今信息爆炸的时代,数据可视化技术已经成为企业决策、业务分析、科学研究等领域不可或缺的重要工具。从最初的静态报表到如今的动态大屏,数据可视化技术经历了翻天覆地的变化,不仅提高了数据处理的效率,还极大地丰富了数据的呈现方式和交互体验。本文将深入探讨数据可视…