在 django 中强制执行严格的 sql 模式

Posted

技术标签:

【中文标题】在 django 中强制执行严格的 sql 模式【英文标题】:Force strict sql mode in django 【发布时间】:2014-05-26 05:09:44 【问题描述】:

我试图强制我的 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)

【问题讨论】:

不要因为这个而讨厌我,因为 django 的初始化代码从未以干净的方式解决:您是否尝试过创建一个中间件类,包括列表中的中间件类,并在运行您在此处建议的代码之后的中间件构造函数? 【参考方案1】:

事实证明,询问是一个很好的橡皮鸭。刚问完,我发现自定义数据库OPTIONS 可以在DATABASES 设置中提供,如下所示:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': 
            'sql_mode': 'traditional',
        
    

希望对大家有所帮助!

【讨论】:

哈哈 +1 回答你自己的问题和"a good rubber duck" :D 请提供所有可用OPTIONS的链接 这里是讨论 sql_mode 选项的 mysql 页面:dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-setting 它就像一个魅力。谢谢!另外,关于OPTIONS的相关链接:docs.djangoproject.com/en/3.0/ref/databases/…【参考方案2】:

您也可以尝试在数据库 [] 中添加以下选项

'OPTIONS': 
        'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
    ,

它的工作。

【讨论】:

我添加了这个,但我仍然收到警告。有没有办法判断它是否正常生效?【参考方案3】:

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模式,可以设置sql_mode 像其他 MySQL 选项一样的变量:在配置文件中或使用 条目 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" 在 OPTIONS 是 DATABASES 中数据库配置的一部分。

【讨论】:

从该文本中不清楚是否应该在settings.pymy.cnf 中设置sql_mode。【参考方案4】:

如果你需要联合queryset,你可以使用python链inster而不是联合。

from itertools import chain

gobj_list = user.groups.all()

robj_list = [obj.roles.all() for obj in gobj_list]

ret_list = chain(*robj_list)

【讨论】:

以上是关于在 django 中强制执行严格的 sql 模式的主要内容,如果未能解决你的问题,请参考以下文章

Mysql大家是用严格模式还是宽松模式

如何开启MYSQL的严格模式

hive严格模式

规范模式和 DDD

MYSQL SQL模式 (未完成)

django - MySQL 严格模式,设置中有数据库 url