| import sqlite3 |
| |
| con = sqlite3.connect(":memory:") |
| cur = con.cursor() |
| |
| # Create the table |
| con.execute("create table person(lastname, firstname)") |
| |
| AUSTRIA = "\xd6sterreich" |
| |
| # by default, rows are returned as Unicode |
| cur.execute("select ?", (AUSTRIA,)) |
| row = cur.fetchone() |
| assert row[0] == AUSTRIA |
| |
| # but we can make pysqlite 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: str(x, "utf-8", "ignore") |
| cur.execute("select ?", ("this is latin1 and would normally create errors" + "\xe4\xf6\xfc".encode("latin1"),)) |
| row = cur.fetchone() |
| assert type(row[0]) == str |
| |
| # pysqlite 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]) == str |
| |
| cur.execute("select ?", ("Germany",)) |
| row = cur.fetchone() |
| assert type(row[0]) == str |