我决定首次将 Django 1.7 与 Python 3 一起使用。
我需要能够使用包含 utf8
数据的旧 latin1
数据库。我知道这很糟糕,但是数据库太大了,真的不可能改变这一点。所以我尝试了以下方法:
DATABASES = {
'ENGINE' : 'django.db.backends.mysql', // using MySQL-python fork with support for py3
...
'OPTIONS' : {
'init_command': "SET character_set_results = 'latin1'",
#'read_default_file': '/etc/my.cnf.d/client.cnf', // I've also tried this one
}
}
我还尝试了来自 Oracle 的 python-mysql-connector 并进行了以下设置
DATABASES = {
'ENGINE' : 'mysql.connector.django', // using MySQL-python fork with support for py3
'OPTIONS' : {
'option_files': ['/etc/my.cnf.d/client.cnf'],
}
}
/etc/my.cnf.d/client.cnf
[client]
init-command='SET character_set_results = "latin1"'
# password, host, username
在这两种情况下,我都可以连接到数据库,但 Django 似乎将 character_set_results 设置回 utf8。
我尝试过以下
from django.db import connection
with connection.cursor() as c:
// I expect variable to be 'latin1'
c.execute("show variables like 'character_set_results%'")
c.fetchone() // returns ('character_set_results', 'utf8')
// here I try to set it manually
c.execute("SET character_set_results = 'latin1'")
c.execute("show variables like 'character_set_results%'")
c.fetchone() // returns ('character_set_results', 'latin1') // now it's OK
- 我确定 django 使用
client.cfg
文件和正确的[section]
,因为它包含用户名/密码并且成功连接到数据库 - 当我在使用相同配置文件的 Linux 终端中使用
mysql
命令时,一切都按预期工作
所以我猜 Django 以某种方式强制 character_set_results
变量为 utf8
。是否可以?有什么办法可以解决这个问题吗?
非常感谢
最佳答案
我终于弄清楚了(我不知道为什么我总是在将其发布到SO后一段时间才能找到解决方案)
from django.db.backends.signals import connection_created
def connection_setup(**kwargs):
conn = kwargs['connection']
with conn.cursor() as cursor:
cursor.execute("SET character_set_results = 'latin1'")
cursor.close()
我之前用 Oracle 的 python-mysql-connector
尝试过,但它抛出了
运行时错误:比较中超出了最大递归深度
但它适用于 MySQL-driver
py3 分支。我想这可能是 python-mysql-connector
或 Django
中的错误,我将报告该错误。也许这会对某人有所帮助。
关于python - 无法将 character_set_results 设置为 latin1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25683570/