Python 一時ファイルとして保存されたデータベースを使用して、sqlite から奇妙な動作が発生しています。基本的に、sqlite_master テーブルのクエリは正常に機能しますが、別のテーブルをクエリすると次のように返されます。
DatabaseError: database disk image is malformed
ソース データベースは、python tempfile として保存されます。
ntf=tempfile.NamedTemporaryFile(suffix='.gdb')
以下はクエリ関数です。
def sqliteQ(string,filename):
'''
string= query string
filename= string file name
'''
con=sqlite.connect(filename)
c= con.cursor()
c.execute(string)
out=c.fetchall()
c.close()
return out
次のようにデータベースを正常にクエリできます。
sq=db.sqliteQ("select sql from sqlite_master where type='table' and name='managements'", gdb.name)
In [13]: sq
Out[13]: 'CREATE TABLE managements (path varchar(255), name varchar(255), data varchar(50000), date date, owner varchar(64), password varchar(64), prot text)'
ただし、次のエラーが返されます。
In[14]: m=db.sqliteQ('select * from managements', gdb.name)
41 con=sqlite.connect(filename)
42 c= con.cursor()
---> 43 c.execute(string)
44 out=c.fetchall()
45 c.close()
/usr/lib/python2.7/dist-packages/sqlite/main.pyc in execute(self, SQL, *parms)
242 if len(parms) == 0:
243 # If there are no paramters, just execute the query.
--> 244 self.rs = self.con.db.execute(SQL)
245 else:
246 if len(parms) == 1 and \
DatabaseError: database disk image is malformed
sqlite コマンド ライン ツールを使用して、両方のクエリを正常に実行できます。どんな提案でも最も役に立ちます。
ピーター
アップデート
を使用している場合にのみ、この問題が発生するようtempfile
です。.zip ファイルをダウンロードし、同封の sqlite データベースを読み込んで、この関数を使用してcStringIO
書き込みます。tempfile
def tGDB (URLo):
mem=io.StringIO(URLo.read())
zf=zp.ZipFile(mem)
ntf=tempfile.NamedTemporaryFile(suffix='.gdb')
ntf.write(zf.read(zf.namelist()[0]))
return ntf
これは、zip から tempfile への変換パイプラインに問題があることを示している可能性があると思いますが、最初のクエリが機能し、2 番目のクエリが機能しないのは非常に奇妙です。