1

:memory:是否可以使用 C API附加命名的 SQLite3数据库?当然有sqlite3_open,但是如何设置要在查询中使用的名称?另外,我可以通过执行ATTACH DATABASE语句来附加它,但是我如何获取它的 DB 指针呢?

背景:

我正在使用虚拟表来驱动 SQLite 接口到一组外部文件。我使用 SQLite 主要是为了访问体面的 SQL 查询和现有的驱动程序,例如 Python。我已经定义了一个函数open_myfiles,它当前根据给定目录中的文件创建所有虚拟表。应用程序只需要执行此操作SELECT open_myfiles('/path/to/tables'),并且使用正确的虚拟表填充数据库。

但是,我正在尝试改进。目前,虚拟表是持久化到当前数据库的,很难加载多个目录。我认为更好的方法是将每个目录附加为一个单独的命名 :memory:数据库。

4

2 回答 2

1

通过传递正确的连接字符串是可能的。重要的阅读是SQLite 文档的这一部分:

  1. 如果您在表单中指定 URI "file::memory:?cache=shared",则所有内存 DB 将被共享
  2. 如果您在表单中指定 URI,"file:memdb1?mode=memory&cache=shared"则 DB 将是在内存中命名的 DB
于 2020-12-23T18:55:30.163 回答
0

经过一番研究,我发现 C api 数据库 ptr 和附加数据库之间没有明确的联系。我不得不修改我最初的方法,下面是我解决它的方法,以防其他人偶然发现。

我没有在扩展加载时注册虚拟表模块,而是为open_myfiles函数的每次调用注册一个虚拟表模块。除了注册模块之外,该函数还执行ATTACH DATABASE ':memory:' AS 'mymod'将虚拟表放在它们各自的命名空间中(CREATE VIRTUAL TABLE事实证明,它也适用于限定名称)。

总而言之,它运作良好。我希望这对其他人有帮助!

于 2012-07-18T12:32:39.570 回答