在我看来,MetaData.reflect()和sqlalchemy.ext.automap.prepare()表应该能够在许多用例中交替使用,但它们不能。
metadata.tables['mytable'] into 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:结果对象提供了一个完全更新的使用模型,并为SQLAlchemy核心和SQLAlchemy ORM调用facade。在核心中,它构成了CursorResult对象的基础,它取代了以前的ResultProxy接口。在使用ORM时,通常使用名为ChunkedIteratorResult的更高级别的对象。
我可以将其中一个转换成另一个吗?,也就是不需要表名的为每个表工作的包装器?
,做这件事最好的防未来的方法是什么?,我希望我的代码能够向前看--使用sqlalchemy2.0。这是否意味着我应该离开automap或MetaData
炼金术1.4.35
发布于 2022-05-16 21:22:44
从表和ORM类中选择() 尽管这些示例中生成的SQL与调用select(user_table)或select(User)的情况相同,但在更一般的情况下,它们不一定呈现相同的内容,因为ORM映射的类可能映射到表之外的其他类型的“可选”类。针对ORM实体的select()还指示应该在结果中返回ORM映射的实例,而来自Table的SELECTing则不是这种情况。
不要犹豫使用ORM。这是更高的层次,丙酮,酷,和自动是ORM。
https://stackoverflow.com/questions/72264182
复制相似问题