强制Django使用严格SQL模式

28 投票
4 回答
33829 浏览
提问于 2025-04-18 02:25

我想让我的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',
        }
    }
}

希望这对大家有帮助!

撰写回答