Warum SQLAlchemy create_engine mit charset=utf8 zurück python-Typ <str> und nicht Typ <unicode>?
Mit Python 2.7 und SQLAlchemy 0.7, ich bin die Verbindung zu einer MySQL-DB mit dem Befehl:
engine = create_engine('mysql://username:password@host/dbname?charset=utf8',echo=False)
Entsprechend der SQLAlchemy-docs, die Einstellung charset=utf-8 impliziert automatisch use_unicode=1, so dass alle Saiten kommen sollte, wieder als unicode. http://docs.sqlalchemy.org/en/rel_0_7/dialects/mysql.html speziell gibt das Beispiel
#set client encoding auf utf8; alle strings als unicode
create_engine('mysql+mysqldb:///mydb?charset=utf8')
Warum also dann, wenn ich ein text-Feld Abfragen in einer Klasse zugeordnet, bedeutet das, dass Feld am Ende mit Typ "str"?
Base = declarative_base(engine)
class RegionTranslation(Base):
''''''
__tablename__ = 'RegionTranslation'
__table_args__ = {'autoload':True}
def __init__(self, region_id, lang_id, name):
self.region_id = region_id
self.lang_id = lang_id
self.name = name
rtrans = session.query(RegionTranslation).filter_by(region_id = 1, lang_id = 6).one()
print (type(rtrans.name))
Die Ausgabe ist
<type 'str'>
Wenn ich einfach akzeptieren und entschlüsseln Sie die Zeichenfolge, bevor Sie es, Dinge sind in Ordnung. Aber ich verstehe nicht, warum der obige code ist nicht Rücksendung der type 'unicode'. Kann mir jemand bitte, bitte erklären?
- Von die Klammern auf Ihrer
print
es sieht aus wie du bist auf Python 3.x. Ist das richtig? - Oh Nein, tut mir Leid, sollte ich angegeben habe, dass ich mit Python 2.7 mit SQLAlchemy version 0.7. Ich habe ein "von Zukunft "importieren " print_function".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Endlich die Antwort gefunden, wenn Sie entdecken, dass ein anderes script, das ich ausführen würden, mehrmals erfolgreich war, funktioniert nicht mehr.
Hatte ich geändert, die Sortierung in meiner Datenbank von utf8_general_ci auf utf8_bin. Es ist ein Fehler in MySQLdb 1.2.3, die Ursachen utf8_bin Zeichenfolgen, die nicht als text erkannt, so dass der unicode-Konvertierung ist nicht passiert. Dies wurde behoben in MySQLdb 1.2.4.
https://sourceforge.net/p/mysql-python/bugs/289/