强制Django使用严格SQL模式
我想让我的Django项目始终使用严格的 sql_mode
。除了在 manage.py
里加上下面的代码,还有其他方法吗?这样做感觉有点复杂。
def set_strict_sql_mode(sender, **kwargs):
from django.conf import settings
if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.mysql':
from django.db import connection
cursor = connection.cursor()
cursor.execute('SET session sql_mode=traditional')
from django.core.signals import request_started
request_started.connect(set_strict_sql_mode)
4 个回答
-1
如果你需要把多个 queryset
合并在一起,可以使用 Python 的链式操作,而不是用 union。
from itertools import chain
gobj_list = user.groups.all()
robj_list = [obj.roles.all() for obj in gobj_list]
ret_list = chain(*robj_list)
1
https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-sql-mode
设置 sql_mode
从 MySQL 5.7 版本开始,以及新安装的 MySQL 5.6,sql_mode 这个选项的默认值里包含了 STRICT_TRANS_TABLES。这个选项的作用是,当你插入数据时,如果数据被截断了,它会把警告提升为错误。因此,Django 强烈建议在 MySQL 中启用严格模式,以防止数据丢失(可以选择 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES)。
如果你需要自定义 SQL 模式,可以像设置其他 MySQL 选项一样设置 sql_mode 变量:可以在配置文件中设置,或者在数据库配置的 DATABASES 部分的 OPTIONS 中加入 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"。
17
你也可以试试在数据库中添加下面这个选项。
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
这样就可以正常工作了。
80
其实,问问题真的是个不错的办法。就在我提问后,我发现了可以在 DATABASES
设置中提供的自定义数据库 OPTIONS
,可以这样写:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'sql_mode': 'traditional',
}
}
}
希望这对大家有帮助!