我有一个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选项,是否有任何潜在的缺陷需要注意?
答案 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)