【发布时间】:2015-02-05 08:21:17
【问题描述】:
我正在为使用旧版 MSSQL 数据库的 Web 应用程序开发一些测试。该数据库相当大,并且有许多与外键互连的表。我正在使用fixture library 创建包含测试数据的表,基于我在SQLalchemy 的应用程序中定义的模型。
我遇到的问题是,当我将一个表添加到具有外键的设备中时,运行测试还需要我添加连接的表,即使我没有使用它。
ProgrammingError: (ProgrammingError) ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Foreign key 'FK__countries__ctry___6C40A441' references invalid table 'directdebit_types'. (1767) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Could not create constraint.
例如,我需要“俱乐部”数据,但俱乐部是“区域”的一部分;我需要在我的灯具中添加一个“区域”表才能继续。添加“区域”后,由于区域链接到国家/地区,因此无法创建表格,所以现在我需要将国家/地区表格添加到我的灯具中。国家再次与 directdebit_types 相关联,所以现在我也需要添加它,即使我只想模拟一些俱乐部数据!
上面的示例错误是我每次开始测试时都会遇到的错误,并且fixture 会尝试设置表。在这种特定情况下,它是从国家到 direcdebit_types 的外键。 跟踪和创建所有互连的表将导致实际上必须创建整个数据库以进行简单测试。
有没有办法解决这个问题?
为了完整起见,这是我的夹具设置的相关部分:
class ClubsData(DataSet):
"""
Fixture dataset class for Clubs
"""
class accesscontrol_test_club:
club_id = '22222222-2222-2222-2222-222222222222'
club_name = 'accesscontrol test country'
class AreasData(DataSet):
"""
Fixture dataset class for Areas
"""
class accesscontrol_test_area:
area_name = 'testarea'
club = ClubsData.accesscontrol_test_club
class CountriesData(DataSet):
"""
Fixture dataset class for Countries
"""
class accesscontrol_test_country:
ctry_shortname = 'accestan'
area = AreasData.accesscontrol_test_area
还有我的模特
class Clubs(db.Model, clubs):
"""Club model class.
"""
shift_terminal = relationship(
"Terminals",
primaryjoin="Terminals.term_id==Clubs.club_terminal_for_shift",
foreign_keys=[clubs.club_terminal_for_shift],
backref=backref('shift_terminal_clubs'))
area = relationship("Areas", backref=backref('clubs'))
...
class Areas(db.Model, areas):
"""Area model class.
"""
country = relationship("Countries", backref=backref('areas'))
def __init__(self, *args, **kwargs):
self.area_id = newid()
super(Areas, self).__init__(*args, **kwargs)
...
class Countries(db.Model, countries):
"""
Country model class.
"""
directdebittype = relationship("DirectdebitTypes", backref=backref('countries'))
def __init__(self, *args, **kwargs):
self.ctry_id = newid()
super(Countries, self).__init__(*args, **kwargs)
...
【问题讨论】:
标签: python testing sqlalchemy fixtures