我想将数据从一个数据库复制到另一个数据库。因此我为此编写了一个Python脚本。
姓名是德语,但我认为这不会成为理解我的问题的问题。
该脚本执行以下操作
db = mysql.connect(db='', charset="utf8", use_unicode=True, **v.MySQLServer[server]);
...
cursor = db.cursor();
cursor.execute('select * from %s.%s where %s = %d;' % (eingangsDatenbankName, tabelle, syncFeldname, v.NEU))
daten = cursor.fetchall()
for zeile in daten:
sql = 'select * from %s.%s where ' % (hauptdatenbankName, tabelle)
...
for i in xrange(len(spalten)):
sql += " %s, " % db_util.formatierFeld(unicode(str(zeile[i]), "utf-8"), feldTypen[i])
“db_util.formatierFeld”方法如下所示
def formatierFeld(inhalt, feldTyp):
if inhalt.lower() == "none":
return "NULL" #Stringtypen
if "char" in feldTyp.lower() or "text" in feldTyp.lower() or "blob" in feldTyp.lower() or "date".lower() in feldTyp.lower() or "time" in feldTyp.lower():
return '"%s"' % inhalt
else:
return '%s' % inhalt
嗯,对你们中的一些人来说,这些东西看起来很奇怪,但我可以保证你们必须这样做,所以请不要讨论风格等。
好的,运行此代码时,当我遇到使用变音符号的单词时,会收到以下错误消息。
Traceback (most recent call last):
File "db_import.py", line 222, in <module>
main()
File "db_import.py", line 219, in main
importieren(server, lokaleMaschine, dbEingang, dbHaupt)
File "db_import.py", line 145, in importieren
sql += " %s, " % db_util.formatierFeld(unicode(str(zeile[i]), "utf-8"), feldTypen[i])
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 1: ordinal not in range(128)
实际上我不明白为什么这个字符串无法以这种方式构建。我认为这应该有效,因为我明确告诉程序在这里使用unicode。
有人猜到这里出了什么问题吗?
答案 0 :(得分:3)
通过对您拥有的表达式进行深度嵌套,更难以解释错误。
在第
行sql += " %s, " % db_util.formatierFeld(unicode(str(zeile[i]), "utf-8"), feldTypen[i])
异常来自哪里?这很难说。但是,我认为它来自str(zeile[i])
。如果zeile[i]
是包含非ASCII字符的unicode,则无法使用str
将其转换为字节字符串。相反,您必须使用编解码器将其编码为字节字符串,该编解码器可以表示它包含的所有字符。
...然而
unicode(str(zeile[i]), "utf-8")
如果zeile[i]
是unicode字符串,这是毫无意义的。首先,您尝试将其编码为字节字符串,然后尝试将其解码回unicode字符串。你可以跳过所有这些,只做zeile[i]
。 formatierFeld
并不重要,因为执行永远不会那么远。