Запишите базу данных в памяти sqlite3 в файл, используя clsql

Как указывает вопрос. Я создал базу данных в памяти, используя ":memory:" и clsql:with-database, чтобы повысить производительность запросов на запись/вставку. Но, в конце концов, я хочу иметь постоянную копию заполненной базы данных на своем жестком диске.

Это должно выглядеть примерно так:

(clsql:with-database (db (":memory:") :database-type :sqlite3)
  ;;entering db-scheme
  ;;entering a bunch of data
  (magically-write-database-to-file db file-path))

Как я могу этого добиться?


person Sim    schedule 04.12.2014    source источник


Ответы (2)


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

(execute-command "PRAGMA journal_mode = OFF")
(execute-command "PRAGMA synchronous = OFF")
person CL.    schedule 04.12.2014
comment
что значительно увеличило скорость записи/вставки. Хотя мне было бы любопытно объяснение. - person Sim; 04.12.2014
comment
synchronous гарантирует, что данные будут записаны на диск после завершения транзакции. Журнал необходим для отката неудачной или прерванной транзакции. Без них прерывание или прерывание записи в базу данных приведет к повреждению базы данных. - person CL.; 04.12.2014

Я думаю, что вам просто нужно создать таблицы с помощью create-view-from-class, а затем вызвать update-records-from-instance для ваших объектов.

Однако я не уверен, действительно ли имеет смысл сначала создавать явную базу данных в памяти. Вы можете просто сначала создать коллекцию объектов, а затем поместить их в базу данных с помощью update-records-from-instance за один раз. «Классы представления» CLSQL на самом деле являются обычными классами с некоторой информацией о том, как их сохранять/загружать. Никакого волшебства не происходит, когда вы просто меняете объекты без сохранения.

person Svante    schedule 04.12.2014