Сохранение python в памяти sqlite

Можно ли сохранить базу данных sqlite в памяти на жесткий диск? Если это возможно, некоторый код python будет потрясающим.

Спасибо заранее.

EDIT:

Мне удалось выполнить эту задачу, используя apsw. Отлично работает. Спасибо за ваш вклад.

Ответ 1

(Раскрытие: я автор APSW)

Единственный безопасный способ сделать двоичную копию базы данных - использовать API-интерфейс резервного копирования, который является частью SQLite и доступен APSW. Это делает правильные вещи с упорядочением, блокировкой и concurrency.

Чтобы создать SQL (текстовую) копию базы данных, используйте оболочку APSW, которая включает в себя реализацию .dump, которая очень полная. Вы можете использовать cursor.execute(), чтобы вернуть SQL обратно в базу данных.

На недавних платформах вы вряд ли увидите большую часть разницы между базой данных памяти и дисковой (при условии, что вы отключили ведение журнала для диска), поскольку операционная система поддерживает кеш файловой системы. Старые операционные системы, такие как Windows XP, имели конфигурацию по умолчанию, использующую только 10 МБ памяти для кеша файлов, независимо от того, сколько у вас RAM.

Ответ 2

Да. Когда вы создаете соединение с базой данных, замените :memory: на путь, в котором вы хотите сохранить БД.

sqlite использует кеши для файловых баз данных, поэтому это не должно быть (намного) медленнее.

Ответ 3

Согласно документации по питону sqlite3, вы можете использовать метод iterdump(), чтобы создать дамп файла .sql вашей базы данных в памяти, а затем применить этот файл .sql просто. в новую файловую базу данных sqlite.

# Convert file existing_db.db to SQL dump file dump.sql
import sqlite3, os

con = sqlite3.connect('existing_db.db')
with open('dump.sql', 'w') as f:
    for line in con.iterdump():
        f.write('%s\n' % line)

Ответ 4

Откройте базу данных на базе диска и просто скопируйте все из одного в другое.

Ответ 5

import apsw

memconn = apsw.Connection(":memory:")
memcursor = memconn.cursor()
memcursor.execute("create table foo(x,y,z)")
memcursor.execute("insert into foo values(?,?,?)", (1, 1.1, None))

thediskconn = apsw.Connection("adisk.db")
with thediskconn.backup("main", memconn, "main") as backup:
    backup.step() # copy whole database in one go

memcursor.close()
memconn.close()
#continue with thediskconn