【问题标题】:Force strict sql mode in django在 django 中强制执行严格的 sql 模式
【发布时间】: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 的初始化代码从未以干净的方式解决:您是否尝试过创建一个中间件类,包括列表中的中间件类,并在运行您在此处建议的代码之后的中间件构造函数?

标签: python mysql django


【解决方案1】:

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

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

希望对大家有所帮助!

【讨论】:

【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2012-05-15
    • 2012-11-06
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多