.. image:: https://github.com/agronholm/sqlacodegen/actions/workflows/test.yml/badge.svg :target: https://github.com/agronholm/sqlacodegen/actions/workflows/test.yml :alt: 构建状态 .. image:: https://coveralls.io/repos/github/agronholm/sqlacodegen/badge.svg?branch=master :target: https://coveralls.io/github/agronholm/sqlacodegen?branch=master :alt: 代码覆盖率
这是一个工具,可以读取现有数据库的结构并生成适当的SQLAlchemy模型代码,尽可能使用声明式风格。
这个工具是作为sqlautocode
_的替代品而编写的,sqlautocode存在多个问题(包括但不限于与Python 3和最新SQLAlchemy版本不兼容)。
.. _sqlautocode: http://code.google.com/p/sqlautocode/
PEP 8
_规范的代码.. _PEP 8: http://www.python.org/dev/peps/pep-0008/
安装方法:
pip install sqlacodegen
要包含对PostgreSQL CITEXT
扩展类型的支持(仅在少数环境下测试过),请指定 citext
额外选项:
pip install sqlacodegen[citext]
要包含对PostgreSQL GEOMETRY
、GEOGRAPHY
和 RASTER
类型的支持(仅在少数环境下测试过),请指定 geoalchemy2
额外选项:
要包含对PostgreSQL PGVECTOR
扩展类型的支持,请指定 pgvector
额外选项:
pip install sqlacodegen[pgvector]
.. code-block:: bash
pip install sqlacodegen[geoalchemy2]
至少,你需要给sqlacodegen一个数据库URL。该URL直接传递给SQLAlchemy的 create_engine()
_ 方法,所以请参考 SQLAlchemy的文档
_ 了解如何构造正确的URL。
示例:
sqlacodegen postgresql:///some_local_db
sqlacodegen --generator tables mysql+pymysql://user:password@localhost/dbname
sqlacodegen --generator dataclasses sqlite:///database.db
查看通用选项列表:
sqlacodegen --help
.. _create_engine(): http://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine .. _SQLAlchemy的文档: http://docs.sqlalchemy.org/en/latest/core/engines.html
选择生成器决定了
以下内置生成器可用:
tables
(仅生成 Table
对象,适用于不想使用ORM的人)declarative
(默认选项;生成继承自 declarative_base()
的类)dataclasses
(生成基于dataclass的模型;仅适用于v1.4+)sqlmodels
(为SQLModel_生成模型类).. _SQLModel: https://sqlmodel.tiangolo.com/
以下选项可以通过 --options
传递开启(多个值必须用逗号分隔,例如 --options noconstraints,nobidi
):
tables
noconstraints
:忽略约束(外键、唯一键等)nocomments
:忽略表/列注释noindexes
:忽略索引declarative
tables
的所有选项use_inflect
:使用 inflect
库命名类和关系(将复数名称转为单数;详见下文)nojoined
:不尝试检测连接类继承(详见下文)nobidi
:以单向方式生成关系,因此只有多对一或多对多关系的第一侧获得关系属性,如v2.X中所示dataclasses
declarative
的所有选项sqlmodel
declarative
的所有选项生成类的代码生成器尽可能生成模型类。在以下两种情况下会生成 Table
而不是模型类:
模型类命名逻辑 ++++++++++++++
默认情况下,表名转换为符合PEP 8规范的有效类名,方法是将所有不适合Python标识符的字符替换为 _
。然后,每个有效部分(由下划线分隔)首字母大写并连接在一起,消除下划线。例如,example_name
变成 ExampleName
。
如果使用 use_inflect
选项,表名(假定为英语)会使用"inflect"库转换为单数形式。例如,sales_invoices
变成 SalesInvoice
。由于表名并不总是英语,且变形过程远非完美,默认情况下禁用变形。
关系检测逻辑 ++++++++++++
根据现有外键约束检测关系,如下: