2010-06-18 58 views
2

我正在使用sqlalchemy的反射工具来获取Table对象。我这样做是因为这些表是动态的,表/列可以更改。下面是我使用的代码:清除sqlalchemy反射缓存

def getTableByReflection(self, tableName, metadata, engine): 

    return Table(tableName, metadata, autoload = True, autoload_with = engine) 

的问题是,当上面的代码运行两次似乎返回相同的结果,无论列是否发生了变化。我尝试使用mysession.refresh(mytable)进行刷新,但由于表未附加到任何元数据而失败 - 这很有道理,但为什么我会看到缓存的结果?

有什么办法告诉元数据/引擎/会话忘记这张表,让我干净地加载它?

+0

不附加到任何元数据?那么你作为'metadata'参数的值传递了什么? – nkrkv 2010-06-18 10:15:26

+0

我使用了我在其余代码中使用的相同元数据对象。错误是'类'sqlalchemy.schema.Table'没有映射' - 我把它表示为它是用元数据做的,但可能不是? – OrganicPanda 2010-06-18 10:49:24

+3

如果您传入新创建的新元数据实例,该怎么办?那样有用吗? – codeape 2010-06-18 10:50:53

回答

5

传递一个新创建的,新鲜的元数据实例。

1

与感谢codeape的评论上面我可以通过改变语法来解决这个问题:

def getTableByReflection(self, tableName, metadata, engine): 

    return Table(tableName, MetaData(), autoload = True, autoload_with = engine) 

所以在新MetaData()实例每次路过。这可能会影响性能,但在我的应用程序的这部分中对我来说没关系。

所有信贷codeape