Загрузить базу данных SQLite3 из виртуальной файловой системы (afero)

Окружение:

1) файл базы данных SQLite3 загружается на файловый сервер

2) Файлы хранятся в виртуальной файловой системе

3) я хочу выполнить sql запросы к этой базе данных

В настоящее время я использую go-sqlite3 с файлом базы данных, расположенным в afero.


Вопрос:

Есть ли возможность загрузить файл базы данных в go-sqlite3 с другим источником, чем файл из файловой системы os.


Текущий подход:

Мое текущее решение - скопировать файл из afero в каталог os.TempDir(), но это не работает с нашим ci и не является реальным решением, так как он больше не использует выделенную файловую систему.

1 ответ

После небольшого погружения в источник я вижу это в sqlite3.go

name := C.CString(dsn)
defer C.free(unsafe.Pointer(name))
rv := C._sqlite3_open_v2(name, &db,
    mutex|C.SQLITE_OPEN_READWRITE|C.SQLITE_OPEN_CREATE,
     nil)

Так что это отвечает на ваш вопрос, фактическое открытие базы данных происходит "снаружи" и "внутри" sqlite3 библиотека. Если мы проверим функцию sqlite3_open_v2 мы видим, что для этого требуется имя файла:

int sqlite3_open_v2(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb,         /* OUT: SQLite db handle */
  int flags,              /* Flags */
  const char *zVfs        /* Name of VFS module to use */
);

Я думаю, что единственный способ здесь - реализовать свою собственную Sqlite VFS, которая каким-то образом взаимодействует с afero абстракции.

Другие вопросы по тегам