【问题标题】:"Error: unable to open database file" for GROUP BY queryGROUP BY 查询的“错误:无法打开数据库文件”
【发布时间】:2023-12-25 09:28:01
【问题描述】:

我有一个 python 脚本,它使用一些外部数据创建一个 sqlite 数据库。这工作正常。但是每次我在这个数据库上执行 GROUP BY 查询时,我都会收到“错误:无法打开数据库文件”。正常的 SELECT 查询有效。

这对于 python 的 sqlite3 库和 sqlite3 cli 二进制文件都是一个问题:

sqlite> SELECT count(*) FROM REC;
count(*)
----------
528489
sqlite> SELECT count(*) FROM REC GROUP BY VERSION;
Error: unable to open database file
sqlite>

我知道这些错误通常是权限错误(我已经阅读了我在 * 上可以找到的关于此主题的所有问题),但我很确定这不是我的情况:

  1. 我说的是易于创建的数据库和读取请求
  2. 我检查了权限:文件及其包含的文件夹都设置了写权限
  3. 我什至可以写入数据库:创建新表没问题。
  4. 设备未满,空间充足。

【问题讨论】:

  • serverfault.com/questions/57596/… 你检查过sqlite文件所在目录的所有权吗?如果该文件位于您的 $HOME 之外,请尝试将其移动到您的 $HOME 并查看问题是否消失。如果是这样,那就是权限/所有权问题。
  • 从您的会话看来,您在 outside 中遇到了与 python 相同的问题,只使用了 sqlite3 命令行实用程序。
  • 正如我试图澄清的那样:这不是权限问题!

标签: sqlite cygwin


【解决方案1】:

确保您的进程有权访问 TEMP 目录。

来自SQLite's Use Of Temporary Disk Files 文档:

SQLite 可以利用瞬态索引来实现 SQL 语言 诸如:

  • ORDER BY 或 GROUP BY 子句
  • 聚合查询中的 DISTINCT 关键字
  • 由 UNION、EXCEPT 或 INTERSECT 连接的复合 SELECT 语句

每个临时索引都存储在自己的临时文件中。这 临时索引的临时文件在 使用它的语句的结尾。

您可能可以通过将temp_store pragma 设置为MEMORY 来验证临时存储是否存在问题:

PRAGMA temp_store = MEMORY;

告诉 SQLite 将 GROUP BY 子句的临时索引保留在内存中。

或者,在分组依据的列上创建显式索引,以防止创建临时索引。

【讨论】:

  • 谢谢,这让我更接近这个问题,它似乎真的是临时目录的问题。我不确定 sqlite3 在 cygwin 环境中使用的临时目录所在的位置。
  • 你必须重新编译 SQLite 本身,设置 SQLITE_TEMP_STORE compilation option
  • 我在尝试创建索引时遇到了unable to open database;有趣的是,我刚刚在同一张表的另一列中创建了另一个索引,它工作正常。这是一个与 OP 不同的问题,但您设置 temp_store = memory 的解决方案对我来说效果很好,非常感谢。
最近更新 更多