UnicodeDecodeError mit sqlalchemy

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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"
    )
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Nachtrag: Hab auch gerade sqlalchemy aktualisiert: Die Fehlermeldung erscheint weiterhin.
Hier noch eine Übersicht der relevanten MySQL Variablen: Screenshot
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

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 :/
Antworten