【问题标题】:Is it possible to set SQL Server query timeout within Django/South?是否可以在 Django/South 中设置 SQL Server 查询超时?
【发布时间】:2013-11-19 09:01:17
【问题描述】:

我有一个 Django 应用程序,我刚刚迁移到 South 以进行模型/数据库同步。在对模型进行一些更改(即添加新的外键字段)后,我创建了一个新的迁移。这是新迁移中的代码示例 0002_auto__add_field_table_new_field.py

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Adding field 'Table.new_field'
        db.add_column(u'Table', 'new_field',
                      self.gf('django.db.models.fields.related.ForeignKey')(to=orm['database.other_table'], null=True, blank=True),
                      keep_default=False)


    def backwards(self, orm):
        # Deleting field 'Table.new_field'
        db.delete_column(u'Table', 'new_field')

当我尝试应用迁移时,查询总是在大约 30 秒后超时,并显示以下错误消息:

sqlserver_ado,dbapi.DatabaseError: (-2147352567, '发生异常。', (0, u'Microsoft SQL Server Native Client 10.0', u'查询超时已过期', None, 0, -2147217871), None)

是否可以增加 SQL Server 查询超时?除了如何在 SSMS 中增加价值之外,我找不到任何关于此的特定文档,但是这样做并没有什么不同。这可能是在 Django settings.py 中完成的吗?

【问题讨论】:

    标签: python sql sql-server django django-south


    【解决方案1】:

    这个问题有点老了,但它是谷歌结果的顶部,所以我想为后来出现的人补充一下,如果你将 pyodbc 与 django-pyodbc 一起使用(特别是 django-pyodbc-azure 更多信息现代 Django),有几个可能感兴趣的设置;特别注意query_timeout 设置:

  • connection_timeout

    整数。设置数据库连接过程的超时时间(以秒为单位)。默认值为 0,表示禁用超时。

  • connection_retries

    整数。设置重试数据库连接过程的次数。默认值为 5。

  • connection_retry_backoff_time

    整数。以秒为单位设置数据库连接过程重试的回退时间。默认值为 5。

  • query_timeout

    整数。设置数据库查询的超时时间(以秒为单位)。默认值为 0,表示禁用超时。

  • query_timeout 设置添加到数据库选项使我能够解决数据库锁发生的问题(我的代码正在执行的写入目前并不重要):

    DATABASES = {
        'default': {
            # ...
            'OPTIONS': {
                'driver': 'FreeTDS',
                'query_timeout': 6,
            },
        },
    }
    

    【讨论】:

      【解决方案2】:

      原来问题是由后端python db模块sqlserver_ado引起的。正是这个模块确定了查询超时。我已将我的 settings.py 修改为现在使用 sql_server.pyodbc ENGINE。使用此迁移,现已成功应用。

      【讨论】:

      • 嗨,我遇到了类似的问题,我想更改超时。你用的是 django-mssql 吗?你是如何在 django 中使用 pyodbc 的?
      【解决方案3】:

      如果您需要坚持使用 sqlserver_ado 驱动程序,您可以按照此问题中的说明设置查询超时(默认为 30 秒): Query timeout expired in django-mssql when executing custom SQL directly

      DATABASES = {
      'default': {
          'NAME': DATABASE_NAME,
          'ENGINE': 'sqlserver_ado',
          'HOST': DATABASE_HOST,
          'USER': DATABASE_USER,
          'PASSWORD': DATABASE_PASSWORD,
          'COMMAND_TIMEOUT': timeout_in_seconds,
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-03-06
        • 2019-03-02
        • 2011-08-07
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多