Как создать несколько баз данных ": memory:" в sqlite3 - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь создать несколько баз данных в памяти с помощью sqlite3 (если это возможно). Для баз данных на диске я бы сделал:

import sqlite3 

db1 = sqlite3.connect('/mnt/tmp/db1.db')
db2 = sqlite3.connect('/mnt/tmp/db2.db')
db3 = sqlite3.connect('/mnt/tmp/db3.db')

Если я вместо этого сделаю:

db1 = sqlite3.connect("file::memory:?cache=shared")
db2 = sqlite3.connect("file::memory:?cache=shared")
db3 = sqlite3.connect("file::memory:?cache=shared")

Будет ли это в результате три отдельных базы данных в памяти? Кажется, это создает три соединения с общей базой данных в памяти, а это не то, что мне нужно.

Затем я продолжаю создавать курсоры в базах данных (на диске или в памяти) с помощью:

cur_db1 = db1.cursor()
cur_db2 = db2.cursor()
cur_db3 = db3.cursor()

Если невозможно создать несколько баз данных в памяти, лучше ли мне использовать базы данных RAM-диска (как в моем первом блоке кода), но затем выполнять "PRAGMA journal_mode=MEMORY" для этих соединений?

1 Ответ

2 голосов
/ 31 октября 2019

Как объяснено в онлайн-документах , указание общего кэша с использованием используемого вами формата URI приведет к тому, что все соединения в одном процессе будут использовать одну и ту же базу данных. Если вы хотите три отдельных экземпляра в памяти, используйте ":memory:" в качестве строки подключения.

ИЛИ также описано на той же веб-странице ...

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

rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...