Я хочу скопировать данные из одной базы данных в другую базу данных. Поэтому для этой цели я написал Python script.
Имена на немецком языке, но я не думаю, что это будет проблемой для понимания моего вопроса.
script выполняет следующие действия
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
Хорошо, некоторым из вас этот материал будет казаться довольно странным, но я могу уговорить вас, я ДОЛЖЕН сделать это таким образом, поэтому, пожалуйста, не обсуждайте стиль и т.д.
Хорошо, при запуске этого кода я получаю следующее сообщение об ошибке, когда я запускаю слова с помощью umlauts.
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.
Кто-нибудь догадывается, что здесь происходит не так?
Ошибка сложнее интерпретировать с помощью глубокого вложения выражений, которые у вас есть.
В строке
sql += " %s, " % db_util.formatierFeld(unicode(str(zeile[i]), "utf-8"), feldTypen[i])
Откуда возникает исключение? Трудно сказать. Однако я бы предположил, что он исходит от str(zeile[i])
. Если zeile[i]
- это unicode, содержащий не-ASCII-символы, то вы не можете преобразовать его в строку байта с помощью str
. Вместо этого вы должны закодировать его в байтовую строку с помощью кодека, который может представлять все содержащиеся в нем символы.
Однако...
unicode(str(zeile[i]), "utf-8")
Это бессмысленно, если zeile[i]
является строкой unicode. Сначала вы пытаетесь закодировать его в байтовую строку, а затем пытаетесь декодировать его обратно в строку юникода. Вы можете пропустить все это и просто сделать zeile[i]
. formatierFeld
не имеет большого значения, поскольку исполнение никогда не доходит до этого.