2

环境:

1) SQLite3 数据库文件被上传到文件服务器

2)文件被存储到虚拟文件系统中

3) 我想对该数据库执行 sql 查询

目前我正在使用go-sqlite3和位于afero的数据库文件。


问题:

是否有可能将数据库文件加载到 go-sqlite3 中,而不是来自 os 文件系统的文件。


目前的做法:

我当前的解决方案是将文件从 afero 复制到 os.TempDir() 目录中,但是我们的 ci 失败了,并且不是实际的解决方案,因为它不再使用专用文件系统。

4

1 回答 1

2

经过一点源潜水后,我在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抽象交互。

于 2018-08-29T13:26:15.527 回答