sqlalchemy表架构自动加载

2024-10-01 11:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个sql炼金术表,如下所示:

myEngine = self.get_my_engine() # creates engine
metadata = MetaData(bind=myEngine)
SnapshotTable = Table("mytable", metadata, autoload=False, schema="my schema")

我必须使用autoloadfalse,因为表可能存在也可能不存在(并且在创建表之前必须运行该代码)

问题是,如果我使用autoload=False,当我试图查询表(在它由另一个进程创建之后)时,我得到一个:

^{pr2}$

错误;这是可以理解的,因为表尚未加载。在

我的问题是:在用autoload=False定义了表元数据之后,如何“加载”它。在

我看着架构.py代码,我似乎可以:

SnapshotTable._autoload(metadata, None, None)

但我觉得这不太对劲…还有其他想法吗?在

谢谢


Tags: 代码selfnonefalsesqlgetschemamy
3条回答

我想问题出在没有反射的元数据上。 您可以尝试使用此调用方法加载元数据执行任何查询:

metadata.reflect() 

它将重新加载表的定义,因此框架将知道如何构建正确的选择。 然后打电话来

^{pr2}$

首先声明表模型:

class MyTable(Base):
    __table__ = Table('mytable', metadata)

或者直接:

^{pr2}$

然后,一旦您准备好加载它,请调用以下命令:

Table('mytable', metadata, autoload_with=engine, extend_existing=True)

其中的关键是扩展现有=真。在

拜耳邮件列表上的所有人。

我昨晚刚刚处理了这个问题,结果发现您只需要在metadat.reflect的帮助下从数据库加载所有可用的表定义。这与@fgblomqvist's solution非常相似。主要区别在于不必重新创建表。从本质上讲,以下几点应该有帮助:

SnapshotTable.metadata.reflect(extend_existing=True, only=['mytable'])

这里的无名英雄是extend_existing参数。它基本上确保重新加载与SnapshotTable相关的模式和其他信息。这里使用参数only来限制检索的信息量。这将为您节省大量的时间,如果您正在处理一个大型数据库

我希望这在将来能起到作用。在

相关问题 更多 >