从C api附加命名的内存数据库

时间:2012-07-17 08:13:51

标签: c sqlite

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

背景:

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

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

2 个答案:

答案 0 :(得分:1)

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

  1. 如果您以 "file::memory:?cache=shared" 的形式指定一个 URI,那么所有内存 DB 都将被共享
  2. 如果您以 "file:memdb1?mode=memory&cache=shared" 的形式指定一个 URI,那么 DB 将是一个 named 内存 DB

答案 1 :(得分:0)

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

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

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