/Doc/includes/sqlite3/text_factory.py
http://unladen-swallow.googlecode.com/ · Python · 43 lines · 25 code · 8 blank · 10 comment · 0 complexity · 83650d37fbdd71d05c6cea6c7edbce5a MD5 · raw file
- import sqlite3
- con = sqlite3.connect(":memory:")
- cur = con.cursor()
- # Create the table
- con.execute("create table person(lastname, firstname)")
- AUSTRIA = u"\xd6sterreich"
- # by default, rows are returned as Unicode
- cur.execute("select ?", (AUSTRIA,))
- row = cur.fetchone()
- assert row[0] == AUSTRIA
- # but we can make sqlite3 always return bytestrings ...
- con.text_factory = str
- cur.execute("select ?", (AUSTRIA,))
- row = cur.fetchone()
- assert type(row[0]) == str
- # the bytestrings will be encoded in UTF-8, unless you stored garbage in the
- # database ...
- assert row[0] == AUSTRIA.encode("utf-8")
- # we can also implement a custom text_factory ...
- # here we implement one that will ignore Unicode characters that cannot be
- # decoded from UTF-8
- con.text_factory = lambda x: unicode(x, "utf-8", "ignore")
- cur.execute("select ?", ("this is latin1 and would normally create errors" +
- u"\xe4\xf6\xfc".encode("latin1"),))
- row = cur.fetchone()
- assert type(row[0]) == unicode
- # sqlite3 offers a builtin optimized text_factory that will return bytestring
- # objects, if the data is in ASCII only, and otherwise return unicode objects
- con.text_factory = sqlite3.OptimizedUnicode
- cur.execute("select ?", (AUSTRIA,))
- row = cur.fetchone()
- assert type(row[0]) == unicode
- cur.execute("select ?", ("Germany",))
- row = cur.fetchone()
- assert type(row[0]) == str