【问题标题】:Django testing MS-SQL legacy database with stored proceduresDjango 使用存储过程测试 MS-SQL 遗留数据库
【发布时间】: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


    【解决方案1】:

    也许在你的 WaOrders 中你可以扩展 save() 方法并在那里调用导出函数。

    【讨论】:

    • 扩展保存方法确实更好,谢谢!但是测试值的情况并没有改变。
    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2013-08-07
    • 2016-02-15
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多