代码之家  ›  专栏  ›  技术社区  ›  Krumelur

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

  •  1
  • Krumelur  · 技术社区  · 14 年前

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

    背景:

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Raffi    5 年前

    这可以通过传递正确的连接字符串来实现。重要的阅读内容是 this part 的SQLite文档:

    1. 如果在表单中指定URI "file::memory:?cache=shared" ,则所有内存DB将被共享
    2. 如果在表单中指定URI "file:memdb1?mode=memory&cache=shared" 那么DB将是 命名的 内存中数据库
        2
  •  0
  •   Krumelur    14 年前

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

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

    总而言之,它运行得很好。我希望这能帮助其他人!