Pythonでsqlite3
を使用してインメモリデータベースを作成しようとしています。
私はdbデータベースファイルを作成し、それに情報を格納する関数を作成しましたが、それは100%機能しています。
しかし、:memory:
と接続しようとすると、いくつかの問題に直面しました。
私がやっていることは:
import sqlite3
def execute_db(*args):
db = sqlite3.connect(":memory:")
cur = db.cursor()
data = True
try:
args = list(args)
args[0] = args[0].replace("%s", "?").replace(" update "," `update` ")
args = Tuple(args)
cur.execute(*args)
arg = args[0].split()[0].lower()
if arg in ["update", "insert", "delete", "create"]: db.commit()
except Exception as why:
print why
data = False
db.rollback()
db.commit()
db.close()
return data
名前テーブルを作成する
execute_db("create table name(name text)")
True
を返しました
このテーブルに情報を挿入します
execute_db("insert into name values('Hello')")
戻ってきた
no such table: name
False
なぜこれが機能しないのですか?ファイルを使用すると機能します:
db = sqlite3.connect("sqlite3.db")
関数を呼び出すたびに、new接続を作成します。各接続呼び出しは、newインメモリデータベースを生成します。
関数の外で接続を作成し、それを関数に渡すか、または 共有メモリ接続 を作成します。
_db = sqlite3.connect("file::memory:?cache=shared")
_
ただし、最後の接続がメモリから削除されると、データベースはerasedになります。あなたの場合、それは関数が終了するたびになります。
明示的にdb.commit()
を呼び出すのではなく、データベース接続を使用する コンテキストマネージャとして :
_try:
with db:
cur = db.cursor()
# massage `args` as needed
cur.execute(*args)
return True
except Exception as why:
return False
_
例外がなければトランザクションは自動的にコミットされ、それ以外の場合はロールバックされます。データを読み取るだけのクエリをコミットしても安全です。