为现有数据库手动创建 ORM 的优缺点?

Posted

技术标签:

【中文标题】为现有数据库手动创建 ORM 的优缺点?【英文标题】:Pros and Cons of manually creating an ORM for an existing database? 【发布时间】:2016-08-09 00:05:00 【问题描述】:

为现有数据库手动创建 ORM 与使用数据库反射有何优缺点?

我正在使用 SQLAlchemy 编写一些代码来访问预先存在的数据库。我知道我可以使用sqlalchemy.ext.automap 自动反映架构并创建映射。

但是,我想知道手动创建映射类与让自动映射做它的魔法是否有任何显着的好处。


如果有显着的好处,SQLAlchemy 可以像 Django 的 inspectdb 那样自动生成 python 映射类吗?这将使创建所有声明性基本映射更快,因为我只需要验证和调整而不是从头开始编写。

编辑: 正如@iuridiniz 在下面所说,有一些模仿Django 的inspectdb 的解决方案。见Is there a Django's inspectdb equivalent for SQLAlchemy?。该线程中的答案与 Python3 不兼容,因此如果您正在寻找实际维护的东西,请查看 sqlacodegen 或 flask-sqlacodegen。

【问题讨论】:

Is there a Django's inspectdb equivalent for SQLAlchemy?的可能重复 感谢您的发现!这样就解决了问题的后半部分。上半场有什么想法吗? 【参考方案1】:

我看到很多表是用CREATE TABLE suppliers AS (SELECT * FROM companies WHERE 1 = 2 );(一个穷人的表副本)创建的,它们没有主键。如果现有表没有主键,则您必须不断捕获异常并将Column 对象提供给映射器。如果您有方便的列对象,那么您已经完成了编写自己的 ORM 层的一半。如果只是完成ORM,就不用担心表是否设置了主键。

【讨论】:

以上是关于为现有数据库手动创建 ORM 的优缺点?的主要内容,如果未能解决你的问题,请参考以下文章

创建Django项目基础

mybatis的优缺点及应用场合

手动创建JDBC及连接池封装等

在现有 AspNetUser 表中手动创建列是个好主意吗?

ORM框架的前世今生

从现有数据库创建实体