Hallo.
Ich programmiere gerade mit Bottle ein kleines Gästebuch. Klappt soweit auch alles.
Wenn ich nur eine längere Eingabe mache, kommt das hier:
ProgrammingError('You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode string
Hab denn auch
c.execute(query, (entry, entry2, ))
in
c.execute(query, (entry, unicode(entry2), ))
entry2 ist die große Texteingabe
geändert. Aber der Fehler kommt immer noch.
Ich nutze Python 2.6.
ProgrammingError
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
1.) Welche DB Anbindung nutzt Du denn?
2.) Woher weißt Du, dass sich der Fehler auf die gezeigte Zeile bezieht?
3.) Was steht denn in den entrys und query?
Generell gilt wie immer bei dem Thema: Viel lesen
http://wiki.python-forum.de/Von%20Umlau ... 0Encodings
http://wiki.python-forum.de/User%20Grou ... folien.pdf
2.) Woher weißt Du, dass sich der Fehler auf die gezeigte Zeile bezieht?
3.) Was steht denn in den entrys und query?
Generell gilt wie immer bei dem Thema: Viel lesen
http://wiki.python-forum.de/Von%20Umlau ... 0Encodings
http://wiki.python-forum.de/User%20Grou ... folien.pdf
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Code: Alles auswählen
#.....
entry= request.GET.get('username', '').strip()
entry2= request.GET.get('user_msg', '').strip()
conn = sqlite3.connect('message.db')
c = conn.cursor()
msg_date = time.strftime("%d. %m. %Y")
query = "INSERT INTO message (name,msg, topic_id, msg_date) VALUES (?,?,%s,'%s')" % (new_id, msg_date)
c.execute(query, (entry, entry2, ))
conn.commit()
c.close()
#....
Möchte einfach nur ein eingegebnen Text (via HTML Formular) in die Datenbank speichern und ausgeben.
Ich würde time.time() als Zeitangabe verwenden (damit kann man meistens mehr anfangen)http://docs.python.org/library/sqlite3 hat geschrieben:Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.) For example:
the more they change the more they stay the same
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Woher weißt Du, dass dieses Encoding stimmt?Sync32 hat geschrieben: entry2 = entry2 .decode("iso-8859-1")
Wo denn? Im Browser?Sync32 hat geschrieben: Aber nun gibt er Umlaute so wieder:
¶Ã¤
Generell: Wenn Du die Parameter-Ersetzung wie von Dav1d angegeben verwendest, wird sqlite aus utf-8 codierte Strings direkt verarbeiten können. So wie im Moment hängt alles nur vom encoding der Python-Datei ab!
Zusätzlich: Ich würde meine Webseiten nur als utf-8 codiert ausliefern.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@Dav1d: Ich würde ja eher die Spalte als Datum deklarieren und `sqlite3.Timestamp.now()` verwenden. Ist besser als eine Zahl der Sekunden von einem bestimmten Zeitpunkt ab gerechnet wobei dieser Zeitpunkt halt nicht überall gleich interpretiert werden muss.
@Sync32: Es hilft nicht weiter wenn Du sagst Umlaute werden so "¶Ã¤" wiedergegeben, weil ja niemand weiss wie diese Glyphen da Zustandegekommen sind. An solchen Stellen solltest Du -- auch selbst! -- immer auf die Bytewerte schauen und nicht wie das irgendwo dargestellt werden mag.
Warum dekodierst Du mit "iso-8859-1"? Bist Du sicher dass die Daten in der Kodierung ankommen?
@Sync32: Es hilft nicht weiter wenn Du sagst Umlaute werden so "¶Ã¤" wiedergegeben, weil ja niemand weiss wie diese Glyphen da Zustandegekommen sind. An solchen Stellen solltest Du -- auch selbst! -- immer auf die Bytewerte schauen und nicht wie das irgendwo dargestellt werden mag.
Warum dekodierst Du mit "iso-8859-1"? Bist Du sicher dass die Daten in der Kodierung ankommen?