使用Django中的GEOGRAPHY列更新SQL Server表

时间:2015-08-17 22:27:04

标签: sql-server django pyodbc

我有一个Django 1.8.3应用程序,我将其作为数据库之一连接到SQL Server Enterprise 2012。我正在使用django-pyodbc-azure==1.8.3.0,我的连接看起来像这样:

'sql_server': {
    'ENGINE': 'sql_server.pyodbc',
    'NAME': 'mydb',
    'USER': 'myuser',
    'PASSWORD': 'mypass',
    'HOST': '173.1.1.1',
    'PORT': 1433,
    'OPTIONS': {
        'host_is_server': True,
    }
},

我在数据库的表中有一个列,它是这样创建的:

ALTER TABLE mytable ADD geo AS GEOGRAPHY::Point (
    latitude
    ,longitude
    ,4326
    ) persisted;
CREATE spatial INDEX SI_mytable__geo ON mytable (geo)

当尝试通过Django管理员更新此表中的任何列时,我收到此错误:

  

('42000',“[42000] [FreeTDS] [SQL Server] UPDATE失败,因为   以下SET选项的设置不正确:'ANSI_NULLS,   QUOTED_IDENTIFIER,CONCAT_NULL_YIELDS_NULL,ANSI_WARNINGS,   ANSI_PADDING”。验证SET选项是否正确使用   计算列和/或过滤的索引视图和/或索引   索引和/或查询通知和/或XML数据类型方法和/或   空间索引操作。 (1934)(SQLExecDirectW)“)

我的数据库目前有以下SET选项:

SELECT 
    is_ansi_nulls_on,
    is_ansi_padding_on,
    is_ansi_warnings_on,
    is_arithabort_on,
    is_concat_null_yields_null_on,
    is_numeric_roundabort_on,
    is_quoted_identifier_on
FROM sys.databases

is_ansi_nulls_on    is_ansi_padding_on  is_ansi_warnings_on is_arithabort_on    is_concat_null_yields_null_on   is_numeric_roundabort_on    is_quoted_identifier_on
0   0   0   0   0   0   0

我只在生产中收到此错误,而不是在我的笔记本电脑上进行开发时。我理解我需要根据错误和答案正确更新SET选项:https://stackoverflow.com/a/9235638/1753891

  • 如何在更新此表之前告诉django-pyodbc-azure发送正确的SET选项?

  • 或者我是否需要更新数据库本身的选项,如果是这样,如果我更改这些SET选项,是否有任何潜在的缺陷需要注意?

1 个答案:

答案 0 :(得分:1)

我最终改变了模型的保存方法中的SET选项,现在这个工作正常。

class MyModel(models.Model):
    # Model fields here
    def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):

        cursor = connections['sql_server'].cursor()
        cursor.execute("""SET ANSI_NULLS ON
        SET QUOTED_IDENTIFIER ON
        SET CONCAT_NULL_YIELDS_NULL ON
        SET ANSI_WARNINGS ON
        SET ANSI_PADDING ON""")
        cursor.close()

        super(MyModel, self).save(force_insert, force_update, using, update_fields)