在 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.py
或my.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 模式的主要内容,如果未能解决你的问题,请参考以下文章