如何使用 Perl 在 Sqlite 中准备 pragma 语句?

How to prepare a pragma statement in Sqlite using Perl?

我尝试准备一个 pragma 语句:

$sth = $dbh->prepare (q{pragma table_info(?)})

但我收到以下错误:

DBD::SQLite::db prepare failed: near "?"

准备字符串有什么问题?

来自DBI docs

With most drivers, placeholders can't be used for any element of a statement that would prevent the database server from validating the statement and creating a query execution plan for it.

所以,我只能假设这种情况下的占位符阻止数据库服务器(或本例中的独立数据库引擎)验证语句。

即使 可以 准备语句,根据 SQLite PRAGMA docs, it looks like table_info is expecting an unquoted table name parameter. DBD::SQLite wants to quote all bind values by default,这无论如何都会导致一个单独的问题。

您可以像您一样准备 PRAGMA 语句,但是您的语句有语法错误。

当给定一个字符串时,?等同于一个字符串文字。所以

SELECT * FROM Table WHERE field = ?

表示

SELECT * FROM Table WHERE field = 'test'

PRAGMA table_info(?)

表示

PRAGMA table_info('test')

问题是你应该给

PRAGMA table_info(test)

因此,您需要使用

$dbh->prepare("PRAGMA table_info(".$dbh->quote_identifier('test').")")

你问了 "Is it a general limitation of prepare, that it can be used only for values and not for identifiers? Or is prepare in my example not aware of the context?"

您只能绑定(准备)值,不能 table 名称或列名称。所有关系数据库afaik都是如此。

使用参数的准备(绑定)使得sqlite可以重用执行计划,从而使sqlite更快。