使用 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 选项:
如何告诉 django-pyodbc-azure 在更新此 table 之前发送正确的 SET 选项?
或者我是否需要更新数据库本身的选项,如果是这样,如果我更改这些 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)
我有一个 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 选项:
如何告诉 django-pyodbc-azure 在更新此 table 之前发送正确的 SET 选项?
或者我是否需要更新数据库本身的选项,如果是这样,如果我更改这些 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)