如何从打开的连接中确定SQLite文件名?

时间:2014-02-09 07:27:29

标签: php sqlite unit-testing

PHP SQLite3类不包含文件名信息,或者提供了一种获取SQLite引擎打开的主文件的方法。

如何确定文件名?

这可能在单元测试中很有意思,以确保客户端使用的文件与配置中的预期文件匹配。

1 个答案:

答案 0 :(得分:2)

如果SQLite3类没有提供返回此信息的属性或方法,则SQLite有一个PRAGMA语句来获取或设置内部数据或修改库行为。

PRAGMA database_list;

它将返回一行,其中包含seq,name,文件字段,分别包含序列ID,数据库的内部名称和文件路径:

0|main|/path/to/yourdatabasefile.db

有些细节值得关注。

  • SQLite库可以使用多个文件。
  • 路径将是规范的,因此遵循符号链接。

单元测试案例示例:

测试当前$ client连接文件是否与$ config-> databaseFilename:

匹配
/**
 * Tests the SQLite client connection
 */
function testClient () {
    $client = ...
    $config = ...
    $row = $client->query("PRAGMA database_list")->fetchArray(SQLITE3_ASSOC);
    $this->assertEquals(
        [
            'seq' => 0,
            'name' => 'main',
            'file' => realpath($config->databaseFilename)
        ],
        $row,
        "The query PRAGMA database_list didn't return what we expected: one database opened by the client, the file returned by the database matching our configuration file."
    );
}

要测试查询是否返回预期结果,一个有效的方法是比较两个数组,一个是预期结果,另一个是fetchArray返回的行。

默认情况下,fetchArray存储两个字段值,一个带有数字索引,另一个带有关联键。这里我们关注包含正确信息的字段,因此我们使用SQLITE3_ASSOC参数来仅获取关联内容。如果您想测试订单,请使用fetchArray(SQLITE3_NUM):

    $row = $client->query("PRAGMA database_list")->fetchArray(SQLITE3_NUM);
    $this->assertEquals(
        [0, 'main', realpath($config->databaseFilename)]
        $row,
        "The query PRAGMA database_list didn't return what we expected: one database opened by the client, the file returned by the database matching our configuration file."
    );

realpath函数用于获取规范路径。

<强>参考文献: