【发布时间】:2014-08-07 10:56:51
【问题描述】:
在 Django 中,我想使用单元测试来测试 MS-SQL Server 遗留数据库。数据库正在使用存储过程来添加数据。情况如下:
-
MS-SQL 数据库在 Django 中有以下设置:
DATABASES['vadain_import'] = { 'ENGINE': 'sql_server.pyodbc', 'USER': 'xx', 'PASSWORD': 'xxx', 'HOST': '192.168.103.102', 'PORT': '', 'NAME': 'Vadain_import', 'OPTIONS': { 'driver': 'SQL Server Native Client 11.0', 'MARS_Connection': True, } } -
数据库的模型是用inspectdb制作的,例子:
class WaOrders(models.Model): order_id = models.IntegerField(primary_key=True, db_column='intOrderId') type = models.TextField(db_column='chvType', blank=True) class Meta: db_table = 'WA_ORDERS' database_name = 'vadain_import' managed = False # (There's a lot more of properties and models) -
在模型中正在执行存储过程。我无法使用存档 Django 的功能,例如 WAOrders.save(),因为在 MS-SQL 数据库的主键是在存储过程中生成的。
@classmethod def export(cls, **kwargs): # Stored procedure for adding data into the db sql = "declare @id int \ set @id=0\ declare @error varchar(1000)\ set @error=''\ exec UspWA_OrderImport\ @intOrderId=@id out\ ,@chvType=N'%s'" % kwargs['type'] + " \ ,@chvErrorMsg=@error output\ select @id as id, @error as 'error' \ " # Connection Vadain db cursor = connections['vadain_import'].cursor() # Execute sql stored procedure, no_count is needed otherwise it's returning an error # Return value primary key of WAOrders try: cursor.execute(no_count + sql) result = cursor.fetchone() # Check if primary key is set and if there are no errors: if result[0] > 1 and result[1] == '': # Commit SP cursor.execute('COMMIT') return result[0] -
有一个用于创建模型的映射,因为 MS-SQL 数据库期望与普通对象不同的数据,例如“订单”。
def adding_data_into_vadain(self, order): for curtain in order.curtains.all(): order_id = WaOrders.export( type=format(curtain.type) ) # relation with default and vadain db. order.exported_id = order_id order.save()
通过运行程序,该功能正常工作,但通过运行“manage.py test”将创建一个测试数据库。这给出了以下问题:
- 通过创建测试数据库缺少南表(这在旧数据库中也不需要)
- 通过将 SOUTH_TESTS_MIGRATE 更改为 False,我收到了默认数据库的表已存在的错误消息。
我的测试如下:
class AddDataServiceTest(TestCase):
fixtures = ['order']
def test_data_service(self):
# add data into vadain_import data
for order in Order.objects.all():
AddingDataService.adding_data_into_vadain(order)
# test the exported values
for order in Order.objects.all():
exported_order = WaOrders.objects.get(order_exported_id=order.exported_id)
self.assertEqual(exported_order.type, 'Pleat curtain')
有人可以告诉我如何测试这种情况吗?
【问题讨论】:
标签: python django sql-server-2008 unit-testing stored-procedures