我决定第一次在Python3中使用Django 1.7,我需要能够使用包含latin1数据的遗留utf8数据库。我知道这很糟糕,但是数据库太大了,所以真的不可能改变它。所以我试着:
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连接器,安装如下
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 OKclient.cfg文件并更正[section],因为它包含用户名/密码,并且成功地连接到数据库mysql命令时,一切都按预期工作。所以我想Django以某种方式将character_set_results变量强制为utf8。有可能吗?我有办法解决这个问题吗?
非常感谢
发布于 2014-09-05 11:41:41
我终于想出来了(我不知道为什么我总是在发到这样的帖子后找到一个解决方案)。
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()我以前用过甲骨文的python-mysql-connector试过它
RuntimeError: maximum recursion depth exceeded in comparison
但它适用于MySQL-driver py3分支。我想这可能是python-mysql-connector或Django中的一个bug,我将向您报告。也许这能帮上忙。
发布于 2014-09-05 18:05:17
如果将mysql连接器python作为选项文件使用在client.cfg中,而不是init命令选项(连接器会忽略它),使用写,charset=latin1,就可以了。
[client]
charset=latin1
# password, host, usernamehttps://stackoverflow.com/questions/25683570
复制相似问题