Можно ли сохранить базу данных sqlite в памяти на жесткий диск? Если это возможно, некоторый код python будет потрясающим.
Спасибо заранее.
EDIT:
Мне удалось выполнить эту задачу, используя apsw. Отлично работает. Спасибо за ваш вклад.
Можно ли сохранить базу данных sqlite в памяти на жесткий диск? Если это возможно, некоторый код python будет потрясающим.
Спасибо заранее.
EDIT:
Мне удалось выполнить эту задачу, используя apsw. Отлично работает. Спасибо за ваш вклад.
(Раскрытие: я автор APSW)
Единственный безопасный способ сделать двоичную копию базы данных - использовать API-интерфейс резервного копирования, который является частью SQLite и доступен APSW. Это делает правильные вещи с упорядочением, блокировкой и concurrency.
Чтобы создать SQL (текстовую) копию базы данных, используйте оболочку APSW, которая включает в себя реализацию .dump, которая очень полная. Вы можете использовать cursor.execute(), чтобы вернуть SQL обратно в базу данных.
На недавних платформах вы вряд ли увидите большую часть разницы между базой данных памяти и дисковой (при условии, что вы отключили ведение журнала для диска), поскольку операционная система поддерживает кеш файловой системы. Старые операционные системы, такие как Windows XP, имели конфигурацию по умолчанию, использующую только 10 МБ памяти для кеша файлов, независимо от того, сколько у вас RAM.
Да. Когда вы создаете соединение с базой данных, замените :memory:
на путь, в котором вы хотите сохранить БД.
sqlite использует кеши для файловых баз данных, поэтому это не должно быть (намного) медленнее.
Согласно документации по питону 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)
Откройте базу данных на базе диска и просто скопируйте все из одного в другое.
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