[英]“NULL identity key” error using SQLAlchemy's base automap to reflect a postgres DB using IDENTITY columns
[英]SQLAlchemy MetaData.reflect() vs. automap_base.prepare()
在我看来MetaData.reflect()
和sqlalchemy.ext.automap.prepare()
表应该能够在许多用例中互换使用,但它们不能。
metadata.tables['mytable']
到conn.execute(select(...))
返回一个sqlalchemy.engine.cursor.CursorResult
并且您的迭代器直接获取列(例如x.columnA
)。
但是automap_base().classes.mytable
进入相同的conn.execute(select(...))
返回一个sqlalchemy.engine.result.ChunkedIteratorResult
并且您需要x.mytable.columnA
才能获得该列。
sqlalchemy.engine.Result()文档说了这么多:
1.4 版中的新功能:Result 对象为 SQLAlchemy Core 和 SQLAlchemy ORM 提供了一个完全更新的使用模型和调用外观。 在 Core 中,它构成了 CursorResult 对象的基础,取代了之前的 ResultProxy 接口。 使用 ORM 时,通常使用称为 ChunkedIteratorResult 的更高级别的对象。
我可以一般地将一种转换为另一种吗? 也就是说,一些适用于每个表而不需要表名的包装器?
什么是最好的面向未来的方法? 我希望我的代码对 sqlalchemy 2.0 具有前瞻性。 这是否意味着我应该远离automap
或MetaData
?
sqlalchemy 1.4.35
尽管无论我们调用 select(user_table) 还是 select(User),这些示例中生成的 SQL 看起来都是一样的,但在更一般的情况下,它们不一定呈现相同的东西,因为 ORM 映射的类可能会映射到其他类型的除了表格之外的“可选择项”。 针对 ORM 实体的 select() 还指示应在结果中返回 ORM 映射的实例,而从 Table 对象中选择时则不是这种情况。
不要犹豫,使用 ORM。 它的级别更高,pythonic,很酷,automap 是 ORM。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.