>设置:
1( SQLite3 数据库文件上传到文件服务器
2( 文件被存储到虚拟文件系统中
3(我想在该数据库上执行SQL查询
目前我正在使用go-sqlite3和位于afero中的数据库文件。
问题:
是否有可能使用操作系统文件系统中的文件以外的其他源将数据库文件加载到 go-sqlite3 中。
当前方法:
我当前的解决方案是将文件从 afero 复制到操作系统中。TempDir(( 目录,但这在我们的 ci 中失败了,并且不是实际的解决方案,因为它不再使用专用文件系统。
经过一点源潜水后,我在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
抽象交互。