2009-08-24 16 views
1

У меня есть база данных sqlite, и я хотел бы сохранить ее только для чтения без каких-либо операций записи в файле базы данных.база данных sqlite только для чтения с временными изменениями

Есть ли способ внести временные изменения в базу данных, не вымывая их на диск постоянно?

В настоящее время я делаю это обходным путем, сохраняя временные данные в базе данных в памяти с той же структурой схемы, что и основной файл базы данных. Проблема с этим подходом заключается в том, что он увеличивает сложность кода, так как я должен запускать все свои запросы в обеих базах данных.

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

ответ

2

Потому что SQLite is transactional должно быть достаточно, чтобы не было COMMIT транзакции (SQLite откатится автоматически при подключении). Вы должны отключить автосоздание с помощью инструкции BEGIN.

1

Вы можете создать temporary table, который будет автоматически удален из базы данных при закрытии соединения.

1
BEGIN IMMEDIATE TRANSACTION; 
do a bunch of stuff; 
ROLLBACK TRANSACTION; 

Если другой поток считывает из базы данных, то ROLLBACK потерпит неудачу с SQLITE_BUSY, но вы можете запустить его снова после того, как ожидающий читает отделку. Если другой поток хочет записать в базу данных, то они ударят вашу блокировку.

Теперь что-то немного смешное в использовании транзакций таким образом, как насчет того, что у вас есть программный слой в стиле ORM между вами и базой данных, который работает непосредственно с вашими собственными объектами и сохраняет временные изменения в памяти?

Я имею в виду, если вы не хотите менять базу данных, возможно, вам нужен другой уровень кода, а не функция базы данных?

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