繁体   English   中英

SQLAlchemy MetaData.reflect() 与 automap_base.prepare()

[英]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 具有前瞻性。 这是否意味着我应该远离automapMetaData

sqlalchemy 1.4.35

这是 Core 和 ORM 之间的区别

从 Table 与 ORM 类中选择()

尽管无论我们调用 select(user_table) 还是 select(User),这些示例中生成的 SQL 看起来都是一样的,但在更一般的情况下,它们不一定呈现相同的东西,因为 ORM 映射的类可能会映射到其他类型的除了表格之外的“可选择项”。 针对 ORM 实体的 select() 还指示应在结果中返回 ORM 映射的实例,而从 Table 对象中选择时则不是这种情况。

不要犹豫,使用 ORM。 它的级别更高,pythonic,很酷,automap 是 ORM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM