Subscribed unsubscribe Subscribe Subscribe

Python, web, Algorithm 技術的なメモ

技術的なメモを書いていきます.pythonistaを目指しています.

文字コードとの戦い(1)

sqlliteを扱っている時に生じたエラーと解決方の備忘録(Python2.7.5)

con = sqllite3.connect('dbfilename.db')
con.text_factory = str # これを追加するだけ
cur = con.cursor()
...
...
cur.execute("""INSERT INTO hoge(foo,bar) VALUES(?,?)""",('ほげ','teehee') ) 

このDBに日本語などのASCII以外の文字をインサートすると,

<class 'sqlite3.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 strings. 

このように怒られます. エンコードutf-8の文字列を扱っていると良くエラーに衝突しますよね. そこで,今回はsqlite3を使った時に出てきたエラー(上記のエラー)の解決方法を紹介します. (実はエラーメッセージにどうしたら良いのかが書かれていますが,備忘録のため続けます)

まず当たり前だが,

# coding: utf-8

は文頭に付けておいてください.

はい.次に先程の問題はこれを追加するだけで解決出来ます.

con = sqllite3.connect('dbfilename.db')
con.text_factory = str # これを追加するだけ
cur = con.cursor()
...
...

python公式ドキュメント にはtext_factoryについてこのように書かれています.

この属性を使って TEXT データ型をどのオブジェクトで返すかを制御できます。
デフォルトではこの属性は unicode に設定されており、 
sqlite3 モジュールは TEXT を Unicode オブジェクトで返します。
もしバイト列で返したいならば、 str に設定してください。

この設定をすることで非ASCIIコード以外の文字列も扱う事が出来るようになります. python3.xではこのような問題は起きません(多分).そろそろpython3.xに移行したいです.