Загрузить базу данных 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
абстракции.