2

我有一个 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 中完成的吗?

4

3 回答 3

1

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

  • 连接超时

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

  • 连接重试

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

  • connection_retry_backoff_time

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

  • 查询超时

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

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

    DATABASES = {
        'default': {
            # ...
            'OPTIONS': {
                'driver': 'FreeTDS',
                'query_timeout': 6,
            },
        },
    }
    
    于 2019-01-03T04:23:50.270 回答
    0

    所以事实证明问题是由后端python db模块sqlserver_ado引起的。正是这个模块确定了查询超时。我已将我的 settings.py 修改为现在使用 sql_server.pyodbc ENGINE。迁移现在已通过利用此成功应用。

    于 2013-11-08T15:57:31.890 回答
    0

    如果您需要坚持使用sqlserver_ado驱动程序,您可以设置查询超时,如本问题所述(默认为 30 秒): Query timeout expired in django-mssql when execution 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,
       }
    }
    
    于 2016-01-17T22:05:21.740 回答