【发布时间】:2016-02-06 00:30:57
【问题描述】:
我有一些测试代码可以为每个测试用例创建表并删除它们。但是,在第一个测试之后所有测试都失败了,因为我依赖于首先使用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() 正确出错?我传递给它的引擎对象知道这些表不存在,但我还需要做些什么,比如以某种方式刷新/重新连接,以便获得预期的行为?
【问题讨论】:
-
我在 SQLAlchemy 方面没有那么丰富的经验,但是你为什么不使用会话?
-
我依赖的代码(我无法更改并且必须使用)没有使用一个。
标签: python sqlalchemy