Python сохранить в памяти sqlite - PullRequest
12 голосов
/ 29 апреля 2011

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

Заранее спасибо.

EDIT:

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

Ответы [ 5 ]

10 голосов
/ 08 мая 2011

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

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

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

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

7 голосов
/ 29 апреля 2011

Да. При создании подключения к базе данных замените :memory: на путь, по которому вы хотите сохранить БД.

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

3 голосов
/ 08 июня 2014

Согласно документации sqlite3 python , вы можете использовать метод 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)
2 голосов
/ 29 апреля 2011

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

1 голос
/ 21 января 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...