使用 Django 中的 GEOGRAPHY 列更新 SQL 服务器 table

Updating SQL Server table with GEOGRAPHY column in Django

我有一个 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,
    }
},

我在数据库的 table 中有一列是这样创建的:

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

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

('42000', "[42000] [FreeTDS][SQL Server]UPDATE failed because the following SET options have incorrect settings: 'ANSI_NULLS, QUOTED_IDENTIFIER, CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations. (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 选项:

我最终更改了模型的保存方法中的 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)