Unicode-Problem mit SQLAlchemy

Ich weiß, ich habe da ein problem mit einer Konvertierung von Unicode, aber ich bin mir nicht sicher, wo es passiert.

Ich bin die Extraktion von Daten über eine der jüngsten Europäischen Reise aus einem Verzeichnis der HTML-Dateien. Einige der Ortsnamen nicht-ASCII-Sonderzeichen (wie é, ô, ü). Ich bekomme die Daten von einem string-Darstellung, die die Datei mit regex.

Wenn ich drucken Sie die Standorte wie finde ich Sie, drucken Sie mit dem Zeichen, so dass die Kodierung muss ok sein:

Le Pré-Saint-Gervais, France
Hôtel-de-Ville, France

Bin ich der Speicherung der Daten in eine SQLite-Tabelle mit SQLAlchemy:

Base = declarative_base()
class Point(Base):
    __tablename__ = 'points'

    id = Column(Integer, primary_key=True)
    pdate = Column(Date)
    ptime = Column(Time)
    location = Column(Unicode(32))
    weather = Column(String(16))
    high = Column(Float)
    low = Column(Float)
    lat = Column(String(16))
    lon = Column(String(16))
    image = Column(String(64))
    caption = Column(String(64))

    def __init__(self, filename, pdate, ptime, location, weather, high, low, lat, lon, image, caption):
        self.filename = filename
        self.pdate = pdate
        self.ptime = ptime
        self.location = location
        self.weather = weather
        self.high = high
        self.low = low
        self.lat = lat
        self.lon = lon
        self.image = image
        self.caption = caption

    def __repr__(self):
        return "<Point('%s','%s','%s')>" % (self.filename, self.pdate, self.ptime)

engine = create_engine('sqlite:///:memory:', echo=False)
Base.metadata.create_all(engine)
Session = sessionmaker(bind = engine)
session = Session()

Ich eine Schleife durch die Dateien und legen die Daten jeweils in die Datenbank:

for filename in filelist:

    # open the file and extract the information using regex such as:
    location_re = re.compile("<h2>(.*)</h2>",re.M)
    # extract other data

    newpoint = Point(filename, pdate, ptime, location, weather, high, low, lat, lon, image, caption)
    session.add(newpoint)
    session.commit()

Sehe ich folgende Warnung auf jedem einfügen:

/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/engine/default.py:230: SAWarning: Unicode type received non-unicode bind param value 'Spitalfields, United Kingdom'
  param.append(processors[key](compiled_params[key]))

Und wenn ich versuche, etwas zu tun mit der Tabelle, wie z.B.:

session.query(Point).all()

Bekomme ich:

Traceback (most recent call last):
  File "./extract_trips.py", line 131, in <module>
    session.query(Point).all()
  File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/orm/query.py", line 1193, in all
    return list(self)
  File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/orm/query.py", line 1341, in instances
    fetch = cursor.fetchall()
  File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/engine/base.py", line 1642, in fetchall
    self.connection._handle_dbapi_exception(e, None, None, self.cursor, self.context)
  File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/engine/base.py", line 931, in _handle_dbapi_exception
    raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
sqlalchemy.exc.OperationalError: (OperationalError) Could not decode to UTF-8 column 'points_location' with text 'Le Pré-Saint-Gervais, France' None None

Ich würde gerne in der Lage, richtig zu speichern und dann wieder die Ortsnamen mit den ursprünglichen Zeichen intakt. Jede Hilfe wäre sehr geschätzt werden.

InformationsquelleAutor Dave Forgac | 2009-06-08
Schreibe einen Kommentar