web-dev-qa-db-ja.com

SQLiteを使用してインメモリデータベースを作成するにはどうすればよいですか?

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
  1. 名前テーブルを作成する

    execute_db("create table name(name text)")
    

    Trueを返しました

  2. このテーブルに情報を挿入します

    execute_db("insert into name values('Hello')")
    

    戻ってきた

    no such table: name
    False
    

なぜこれが機能しないのですか?ファイルを使用すると機能します:

db = sqlite3.connect("sqlite3.db")
13
Deounix

関数を呼び出すたびに、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
_

例外がなければトランザクションは自動的にコミットされ、それ以外の場合はロールバックされます。データを読み取るだけのクエリをコミットしても安全です。

11
Martijn Pieters