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

时间:2015-10-28 15:56:51

标签: perl sqlite prepared-statement dbi

我试着准备一个pragma声明:

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

但是我收到以下错误:

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

准备字符串有什么问题?

3 个答案:

答案 0 :(得分:4)

来自DBI docs

  

对于大多数驱动程序,占位符不能用于任何元素   声明会阻止数据库服务器验证   语句并为其创建查询执行计划。

因此,我只能假设这种情况下的占位符阻止数据库服务器(或本例中的自包含数据库引擎)验证该语句。

即使语句可以准备好,根据SQLite PRAGMA docs,看起来table_info期待一个不带引号的表名参数。 DBD :: SQLite希望quote all bind values by default,因此无论如何都会导致单独的问题。

答案 1 :(得分:3)

您可以像处理一样准备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').")")

答案 2 :(得分:0)

你问“这是准备的一般限制吗,它只能用于值而不能用于标识符?或者在我的例子中准备不知道上下文?”

您只能绑定(准备)值,而不能绑定表名或列名。对于所有相关的数据库都是如此。

使用参数的准备(绑定)使sqlite可以重用执行计划,因此它使sqlite更快。