# /settings.py
# MySQL数据库配置项
MYSQL_OPTIONS = {
# 使用严格模式TRADITIONAL插入数据
'sql_mode': 'TRADITIONAL',
'charset': 'utf8',
'init_command': """
SET default_storage_engine=INNODB;
SET character_set_connection=utf8,collation_connection=utf8_unicode_ci;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
"""
}
DATABASES = {
'default': {
'ENGINE': 'transaction_hooks.backends.mysql',
'NAME': os.environ.get('DATABASE_NAME', 'ralph_ng'),
'USER': os.environ.get('DATABASE_USER', 'ralph_ng'),
'PASSWORD': os.environ.get('DATABASE_PASSWORD', 'ralph_ng') or None,
'HOST': os.environ.get('DATABASE_HOST', '127.0.0.1'),
'PORT': os.environ.get('DATABASE_PORT', 3306),
'OPTIONS': MYSQL_OPTIONS,
# 设置数据库交互方式为事务
'ATOMIC_REQUESTS': True,
'TEST': {
'NAME': 'test_ralph_ng',
}
}
}
mysql5.0以上版本支持三种sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES。
ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。
STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。
mysql_sql_mode链接
init_command
This sets the default storage engine upon connecting to the database. After your tables have been created, you should remove this option as it adds a query that is only needed during table creation to each database connection.
这将在连接到数据库时设置默认的存储引擎。在创建表之后,应删除此选项,因为它只在创建表时将需要的查询添加到每个数据库连接。
Q:有谁知道为什么有必要删除表后创建该选项?
A:通常,权限和设置是基于树的。你的会话设置将是一个指向默认设置的高于你的水平的指针。您的会话设置将会被创建,并且只在第一次连接时引用默认设置。
当你修改一个设置时,例如通过设置storage_engine的值,你要么创建所有设置的新副本,并改变一个值(如在Apache中),要么增加另一个层到解析时必须检入的树值。我不确定哪一个MySQL使用,但不管怎样,如果你不需要这个设置,你不应该每次往返都设置它。
如果你确实比较频繁地使用它,那么性能可能是值得的。PHP中出现类似的问题。你不想修改像PHP代码中的PHP包含路径这样的变量,这个变量用来增加大量的开销。
stackoverflow QA