Seite 1 von 1

UnicodeDecodeError mit sqlalchemy

Verfasst: Dienstag 26. Juni 2012, 12:59
von microkernel
Hallo! :)
Ich habe folgendes Problem: Ich möchte mit sqlalchemy Daten in meine MySQL Datenbank speichern. Die Daten sind beim Absenden der InsertExpression Unicode kodiert. Der Serverzeichensatz ist laut phpMyAdmin "UTF-8 Unicode (utf8)". Die Kollation meiner Tabelle ist "utf8-bin". Dennoch erhalte ich beim Ausführen der InsertExpressions folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
[...]
expr.execute()
  File "C:\Python27\lib\site-packages\sqlalchemy-0.6.5-py2.7.egg\sqlalchemy\sql\expression.py", line 2510, in execute
    return e._execute_clauseelement(self, multiparams, params)
  File "C:\Python27\lib\site-packages\sqlalchemy-0.6.5-py2.7.egg\sqlalchemy\engine\base.py", line 1795, in _execute_clauseelement
    return connection._execute_clauseelement(elem, multiparams, params)
  File "C:\Python27\lib\site-packages\sqlalchemy-0.6.5-py2.7.egg\sqlalchemy\engine\base.py", line 1271, in _execute_clauseelement
    return self.__execute_context(context)
  File "C:\Python27\lib\site-packages\sqlalchemy-0.6.5-py2.7.egg\sqlalchemy\engine\base.py", line 1302, in __execute_context
    context.parameters[0], context=context)
  File "C:\Python27\lib\site-packages\sqlalchemy-0.6.5-py2.7.egg\sqlalchemy\engine\base.py", line 1394, in _cursor_execute
    context)
  File "C:\Python27\lib\site-packages\sqlalchemy-0.6.5-py2.7.egg\sqlalchemy\engine\default.py", line 299, in do_execute
    cursor.execute(statement, parameters)
  File "C:\Python27\lib\site-packages\mysql_python-1.2.3-py2.7-win32.egg\MySQLdb\cursors.py", line 159, in execute
    query = query % db.literal(args)
  File "C:\Python27\lib\site-packages\mysql_python-1.2.3-py2.7-win32.egg\MySQLdb\connections.py", line 264, in literal
    return self.escape(o, self.encoders)
  File "C:\Python27\lib\site-packages\mysql_python-1.2.3-py2.7-win32.egg\MySQLdb\connections.py", line 202, in unicode_literal
    return db.literal(u.encode(unicode_literal.charset))
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 33: ordinal not in range(256)
Nun verstehe ich nicht warum versucht wird meine Daten nun doch mit "latin-1" zu enkodieren obwohl ich doch eigentlich utf-8 voraussetze.

Viele Grüße,
microkernel

Re: UnicodeDecodeError mit sqlalchemy

Verfasst: Dienstag 26. Juni 2012, 13:16
von microkernel
Nachtrag: :D Ja.... ich kenne die Folien von Leonidas. Ich weiß auch eigentlich wie ich mit den Zeichensetzen umzugehen habe. Mein Problem, ist dass ich nicht verstehe, warum meine Daten nun irgendwo nun doch in latin-1 kodiert werden (zumindest wird es versucht).

Re: UnicodeDecodeError mit sqlalchemy

Verfasst: Dienstag 26. Juni 2012, 13:20
von Hyperion
Gibst Du SQLAlchemy bei `create_engine` denn UTF-8 als Encoding explizit an? Evtl. ist da `Latin-1` default auf Windows...

Edit: Ich sehe grad, dass zumindest bei 0.7 UTF-8 default ist.

Re: UnicodeDecodeError mit sqlalchemy

Verfasst: Dienstag 26. Juni 2012, 13:36
von cofi
Hyperion hat geschrieben:Gibst Du SQLAlchemy bei `create_engine` denn UTF-8 als Encoding explizit an? Evtl. ist da `Latin-1` default auf Windows...

Edit: Ich sehe grad, dass zumindest bei 0.7 UTF-8 default ist.
Laut der Fehlermeldung, ist es aber 0.6.5, dein Einwand bleibt also gueltig ;)

Re: UnicodeDecodeError mit sqlalchemy

Verfasst: Dienstag 26. Juni 2012, 13:37
von microkernel
Ja, hab ich gemacht:

Code: Alles auswählen

# set up engine
engine = sqlalchemy.create_engine(
    "mysql://%(user)s:%(password)s@%(host)s:%(port)d/%(database)s" % __LOGIN__,
    encoding="utf-8"
    )

Re: UnicodeDecodeError mit sqlalchemy

Verfasst: Dienstag 26. Juni 2012, 13:45
von microkernel
Nachtrag: Hab auch gerade sqlalchemy aktualisiert: Die Fehlermeldung erscheint weiterhin.
Hier noch eine Übersicht der relevanten MySQL Variablen: Screenshot

Re: UnicodeDecodeError mit sqlalchemy

Verfasst: Dienstag 26. Juni 2012, 15:09
von microkernel
Okay anscheinend hab ich das Problem jetzt folgendermaßen gelöst:

Code: Alles auswählen

# set up engine
engine = sqlalchemy.create_engine(
    "mysql://%(user)s:%(password)s@%(host)s:%(port)d/%(database)s" % __LOGIN__,
    encoding="utf-8",
    convert_unicode=True)
Ich musste die convert_unicode Flag auf True setzen und anscheinend funktioniert es nun... Kann mir aber nicht wirklich erklären warum das funktioniert :/