表删除后SQLAlchemy表现不正常

时间:2016-02-05 16:11:00

标签: python sqlalchemy

我有一些测试代码可以为每个测试用例创建表并删除它们。但是,所有测试都在第一个之后失败,因为我依赖于首先使用sa.Table()的代码,而只有在使用NoSuchTableError调用该方法错误时才创建新表。但是,即使引擎正确报告它们不存在,也不会在首次删除表后抛出此错误,因此不会再次创建它们。

我已将此行为重现如下:

>>>import sqlalchemy as sa
>>>from sqlalchemy import *
>>>m = MetaData()

这些表不存在,因此请在此处调用sa.Table错误:

>>>t = sa.Table('test', m, autoload_with=eng) 
...
NoSuchTableError: test

但是如果我创建表然后删除它,sa.Table不会按预期发生错误:

>>>t = sa.Table('test', m, Column('t', String(2)))
>>>m.create_all(eng)
>>>eng.has_table('test')
True
>>>t = sa.Table('test', m, autoload_with=eng)
>>>eng.execute('drop table "test" cascade')
<sqlalchemy.engine.result.ResultProxy at 0x106a06150>
>>>eng.has_table('test')
False
>>>t = sa.Table('test', m, autoload_with=eng)

在最后一次调用sa.Table后,即使该表不存在,也不会引发错误。

删除表后,我需要做些什么才能使sa.Table()正确出错?我传递给它的引擎对象知道这些表不存在,但我还需要做些什么,比如以某种方式刷新/重新连接,以便我得到预期的行为?

1 个答案:

答案 0 :(得分:2)

事实证明,如果我希望架构发生变化,每次调用sa.Table时都需要刷新MetaData对象(创建一个新对象)。这解决了这个问题。