DatenMetzgerX hat geschrieben:Code: Alles auswählen
OperationalError: Could not decode to UTF-8 column 'tooltip' with text 'Ausgewählte Textgruppe editieren'
Sicher wieder was einfaches

Hi DatenMetzgerX!
Nein, so einfach ist das gar nicht. Ich halte das für einen der größten Schwachpunkte von Python. Statt wie Visual Basic, nur mit Unicode zu arbeiten, gibt es bei Python immer ein Hin und Her zwischen den verschiedensten Encodings. So auch im Zusammenspiel mit Datenbanken.
Ich gehe jetzt einfach mal davon aus, dass du pySQLite meinst, da es "pysql" nicht gibt.
Die für mich derzeit einfachste Möglichkeit, dem ganzen Encoding-Schlamassel aus dem Weg zu gehen, ist zwar etwas umständlich, aber sie funktioniert. --> Alles Unicode.
Was ich damit meine? Fülle die Datenbank nur mit Unicode-Strings und erwarte im Gegenzug Unicode-Strings. Leider kümmert sich Python nicht von selbst darum, dass beim Ausgeben der Daten an die Konsole auch das richtige Encoding verwendet wird. Deshalb habe ich im folgenden Beispiel auch noch einen kleinen Hack dafür eingebaut.
Die Angabe des Codings im Kopf des Moduls ist essentiell. Dass das angegebene Coding auch mit dem der Datei zusammenstimmt -- davon gehe ich aus. Siehe:
http://www.python-forum.de/topic-5095.html
Und hier das Beispiel mit Unicode (man beachte die vielen u vor den Strings):
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import sys
import codecs
import os
try:
import sqlite3 # Ab Python 2.5
except ImportError:
from pysqlite2 import dbapi2 as sqlite3
# STDOUT-Encoding herausfinden und StdOut umleiten (für print-Anweisungen)
# Streamwriter mit korrektem Encoding (!!!funktioniert so nicht im IDLE!!!)
out_enc = sys.stdout.encoding or sys.getfilesystemencoding()
sys.stdout = codecs.getwriter(out_enc)(sys.__stdout__)
#
# Schreiben
#
# Nur zum Testen: Alte Datei vorher loeschen
try:
os.remove("dateiname.s3db")
except:
pass
# Verbindung herstellen
conn = sqlite3.connect(
"dateiname.s3db",
isolation_level = None, # Autocommit
)
cur = conn.cursor()
# Tabelle erstellen
sql = u"""
CREATE TABLE adressen (
first_name varchar,
last_name varchar,
age int
)
"""
cur.execute(sql)
# Werte in die Tabelle schreiben
personen = [
{"first_name": u"Geroldä", "last_name": u"Penzö", "age": "31"},
{"first_name": u"Ludwigü", "last_name": u"Bucherä", "age": "29"},
]
sql = u"""
INSERT INTO adressen (
first_name,
last_name,
age
)
VALUES (
:first_name,
:last_name,
:age
)
"""
cur.executemany(sql, personen)
# Verbindung schliessen (nur zum Testen)
cur.close()
conn.close()
#
# Lesen
#
# Verbindung herstellen
conn = sqlite3.connect("dateiname.s3db")
cur = conn.cursor()
sql = u"""
SELECT
first_name, last_name, age
FROM
adressen
"""
cur.execute(sql)
rows = cur.fetchall()
for row in rows:
vorname, nachname, alter = row
print "Datensatz:", row
print "Vorname: ", vorname, "==>", type(vorname)
print "Nachname: ", nachname, "==>", type(nachname)
print "Alter: ", alter, "==>", type(alter)
print
# Verbindung schliessen
cur.close()
conn.close()
Hier noch zwei interessante Links zu diesem Thema:
http://initd.org/tracker/pysqlite/wiki/ ... orTEXTdata
http://initd.org/tracker/pysqlite/ticket/139
lg
Gerold
Stichwoerte: sqlite pysqlite umlaute unicode