それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

pysqliteはutf8以外でエラーになる?

みんなのPython で、pysqliteを使ったサンプルコード*1がある。これをShift_JISで動かしてやる

#coding=shift_jis
import sqlite3

#郵便番号
postnum = [ ["東京都千代田区", "100-0000"],
			["東京都千代田区皇居外苑", "100-0001"],
			["東京都千代田区飯田橋", "102-0072"],
			["東京都千代田区一番町", "102-1082"],
			["東京都千代田区岩本町", "103-0032"],
		  ]
#コネクションを作る
con = sqlite3.connect(":memory:")
cur = con.cursor()

#テーブル作成
cur.execute( """CREATE TABLE postdb( adress text, postno text)""" )

#登録
for item in postnum:
	cur.execute(""" INSERT INTO postdb ( adress, postno ) 
					VALUES ( ?, ?)  """, item)

cur.execute( "SELECT  * FROM postdb WHERE postno = ?", ("102-0072",))
data = cur.fetchone()
print data

エンコードShift_JISで統一してるんだから当然動きそうなのである。ところがエラーになる。

Traceback (most recent call last):
  File "C:\sql.py", line 23, in <module>
    cur.execute( "SELECT  * FROM postdb WHERE postno = ?", ("102-0072",))
sqlite3.OperationalError: Could not decode to UTF-8 column 'adress' with text '東京都千代田区飯田橋'

sqliteが返した結果をUTF-8に変換できませんってエラーっぽい。内部エンコードに変換できなくてエラー。エラーをキャッチして、エンコードを指定してやろうにも、モジュールいじらないと駄目っぽい。どうすればいい?教えて、Pythonの偉い人。

そりゃ。まぁ、ソースをUnicode使うようにしたらエラー無く進むのね。

#..省略
#郵便番号
postnum = [ [u"東京都千代田区", "100-0000"],
			[u"東京都千代田区皇居外苑", "100-0001"],
			[u"東京都千代田区飯田橋", "102-0072"],
			[u"東京都千代田区一番町", "102-1082"],
			[u"東京都千代田区岩本町", "103-0032"],
		  ]

#..省略
print data[0].encode("shift_jis")

これだと、Shift_JISつかってるわけじゃなく、Unicodeでプログラムしてるから、やりたいことがちょっと違う。それにencodeメソッドが美しくない。

*1:うちの環境Python2.5+winxpでは、サンプルコード自体がエラーを出して動かない、サンプルコードにエラーがあるのかな