После небольшого погружения с источником я вижу это в 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)
Таким образом, это отвечает на ваш вопрос, фактическое открытие базы данных происходит «вне» Go и «внутри» библиотеки 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
абстракциями.