【问题标题】:How and When to Execute PRAGMA statement in SQLite?如何以及何时在 SQLite 中执行 PRAGMA 语句?
【发布时间】:2019-04-01 08:07:15
【问题描述】:

我正在使用 SQLite。我只是想知道如何以及何时在 sqlite 中执行 PRAGMA 语句。

比如我要执行:

PRAGMA schema.journal_mode = OFF;

根据https://www.sqlite.org/pragma.html#pragma_journal_mode 的文档,我想我应该在 sqlite3_open() 之后和创建任何表之前执行它。因此,我只是调用 sqlite3_prepare_v2() 和 sqlite3_step() 来执行上面的 PRAGMA,以提高数据库操作的性能。但是,在 PRAGMA 声明之后,似乎没有任何变化,性能也没有提高。

在这种情况下,如何知道PRAGMA语句是否执行并生效?

谢谢

【问题讨论】:

  • 你使用的是字面意思“schema”吗?它应该是“main”或另一个附加数据库的名称(或不使用它)。
  • 其实我根本不用schema,我的说法是PRAGMA journal_mode = OFF;

标签: sqlite


【解决方案1】:

许多 Pragma 将返回设置值,另外仅使用 Pragma,不带参数将返回当前值(在某些情况下,只有后者会返回状态/当前值)。

PRAGMA journal_mode = OFF 将返回关闭的结果。 PRAGMA journal_mode 将返回当前值而不影响它。

因此,就好像它是一个查询一样,结果集中的列名在许多情况下将与正在执行的 pragma 相同。那些返回多个列(如 database_list)的将返回特定于 pragma 的列。

例如

PRAGMA journal_mode;
PRAGMA journal_mode = OFF;
PRAGMA journal_mode;
PRAGMA journal_mode = DELETE;
PRAGMA journal_mode;

结果:-

【讨论】:

  • 谢谢。是否有其他方法可以验证期刊是否关闭?例如,SQLite 会将日志以特定名称保存在特定目录中,然后我可以检查该日志文件是否存在以确认该日志是否已关闭。
  • 不可靠,因为日志文件不必存在,因为 DELETE 是默认设置,所以它不存在并不一定意味着它是关闭的。 Temporary Files Used By SQLite (see 2.1)
  • 当我使用“PRAGMA synchronous = OFF;”时,该语句不返回任何结果。如何知道参数设置正确?
  • 我认为“PRAGMA journal_mode = OFF;”和“PRAGMA 同步 = 关闭;”应该是在打开数据库之后创建表之前执行,对吗?
  • 使用PRAGMA synchronous; 获取结果。请注意,根据文档,结果是数字,例如 0 = Off 等。我不相信表格是否存在。而是没有交易必须是不完整的。但最好在打开连接后尽快使用。
猜你喜欢
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多