いくつかのデータをsqlite3に保存するPythonプログラムがあり、それを別のOSで使用したいと思いました。
Windows 7ではプログラムは正常に動作しますが、Ubuntu12.04では動作しません。
問題は次のとおりです。空のタプルをsqliteデータベースに(からの文字列として " ".join( ... )
)格納し、それをWindowsに読み戻すと、空のタプルが取得されますが()
、Ubuntuでは取得されNone
ます。
私のテストコードは次のとおりです。
import sqlite3
import os
def adapt_tuple(tpl):
return " ".join(str(n) for n in tpl)
def get_tuple(s):
return tuple([int(x) for x in s.split()])
emptytuple=()
goodtuple=(1,2)
sqlite3.register_adapter(tuple,adapt_tuple)
sqlite3.register_converter("tuple_of_ints",get_tuple)
myconn=sqlite3.connect('test.db',detect_types=sqlite3.PARSE_DECLTYPES)
myconn.execute("""CREATE TABLE test(number int, tuple tuple_of_ints);""")
goodentry=(1,goodtuple)
emptyentry=(2,emptytuple)
myconn.execute("""INSERT INTO test VALUES (?,?);""", goodentry)
myconn.execute("""INSERT INTO test VALUES (?,?);""", emptyentry)
for row in myconn.execute("""SELECT * FROM test;"""):
print row
myconn.close()
os.remove('test.db')
これにより、次の出力が得られます。
(1, (1, 2))
(2, ())
Windowsと:
(1, (1, 2))
(2, None)
Ubuntuで。
私はそれをチェックしました
get_tuple(adapt_tuple(emptytuple))
両方のシステムで同じ出力が得られる()
ため、sqlite3を実行することと関係がある必要があります。
sys.version_info
Pythonでの出力は両方のシステムで同じであるsqlite3.version
ため、オペレーティングシステムと関係があると確信しています。
だからsumarryで、私の質問は:なぜこれが起こっているのですか?そして、Ubuntuバージョンが最後に空のタプルを返すようにするにはどうすればよいですか?
返信ありがとうございます。アップル。
ノート
最初に言及したはずですが、adapt_tuple
出力を印刷する" "
と、両方のオペレーティングシステムで取得できます。