ProgrammingError

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

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.
Benutzeravatar
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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

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()
        #....
Hätte nicht gedacht, dass es Schwerigkeiten bereitet.
Möchte einfach nur ein eingegebnen Text (via HTML Formular) in die Datenbank speichern und ausgeben.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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:
Ich würde time.time() als Zeitangabe verwenden (damit kann man meistens mehr anfangen)
the more they change the more they stay the same
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

So hab meien Nachricht vorm Speichern decodiert:


entry2 = entry2 .decode("iso-8859-1")

Aber nun gibt er Umlaute so wieder:
¶Ã¤
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sync32 hat geschrieben: entry2 = entry2 .decode("iso-8859-1")
Woher weißt Du, dass dieses Encoding stimmt?
Sync32 hat geschrieben: Aber nun gibt er Umlaute so wieder:
¶Ã¤
Wo denn? Im Browser?

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
BlackJack

@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?
Antworten