2016-07-30 5 views
4

Я пытаюсь создать базу данных в памяти, используя sqlite3 в Python.Как создать базу данных в памяти с помощью sqlite?

Я создал функцию для создания файла базы данных базы данных и хранения информации для нее, и она работает на 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") 
+0

Почему двойной 'db.commit()' при изменении данных? –

+0

@MartijnPieters Ох, мое плохое спасибо. – Deounix

ответ

5

Вы создаете соединение нового при каждом вызове функции. Каждый вызов соединения создает новую базу данных в памяти.

Создать соединение вне функции и передать его в функцию, или создать shared memory connection:

db = sqlite3.connect("file::memory:?cache=shared") 

Однако база данных будет стерта когда Последнее соединение удаляется из памяти; в вашем случае это будет каждый раз, когда функция закончится.

Вместо явного вызова db.commit(), просто использовать подключение к базе данных as a context manager:

try: 
    with db: 
     cur = db.cursor() 
     # massage `args` as needed 
     cur.execute(*args) 
     return True 
except Exception as why: 
    return False 

Сделка автоматически фиксируется, если не было исключением, откатывается в противном случае. Обратите внимание, что безопасно совершать запрос, который только считывает данные.

+0

, но если я создаю соединение с общей памятью, это соединение Быстрое соединение с памятью? – Deounix

+0

@Deounix: нет разницы в скорости. –

Смежные вопросы