可以在 DBI 的 selectcol_arrayref & 中使用命名占位符公司?
在 DBI 允许 @bind_values 的情况下是否可以使用命名占位符?例如,我想做这样的陈述:
my $s = $DB->selectcol_arrayref ("SELECT a FROM b
WHERE c = ? OR d = ? OR e = ?;",
{},
$par1, $par2, $par1) or
die ($DB->errstr ());
不太容易出错。我正在使用 DBD::Pg 和 DBD::SQLite。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
支持什么类型的占位符(如果有)取决于司机:
但你很幸运,PostgreSQL 驱动程序 支持命名或编号参数:
SQLite 驱动程序也支持它们:
缺点是您最终将大量使用
bind_param
和命名参数,因此您将无法使用selectcol_arrayref
和$sth 等便利工具>execute(1,2,3)
(注意:如果有人知道如何在execute
中使用命名占位符,我会很感激评论中的一些指示,我从来没有弄清楚如何去做)。但是,您可以使用各种形式的数字占位符(例如对于 PostgreSQL 为select c from t where x = $1
或对于 SQLite 为select c from t where x = ?1
)。另请注意,PostgreSQL 使用冒号表示数组切片,使用问号表示某些运算符,因此有时标准 ? 占位符和 :name 命名占位符可能会导致问题。我从来没有遇到过任何问题 ? 但我从未使用过 几何运算符 之一;我怀疑合理使用空格可以避免 ? 的任何问题。如果您不使用 PostgreSQL 数组,那么您可能不必担心 数组切片与您的
:name
命名占位符发生冲突。执行摘要:您不能将命名占位符与
selectcol_arrayref
或与@bind_params
配合使用的类似方法一起使用。但是,对于 SQLite 和 Postgresql,您可以使用编号占位符($1
、$2
、... 对于 Postgresql 或?1
、?2
, ... 对于 SQLite),使用与@bind_params
配合使用的方法,或者您可以使用命名占位符(:name
对于 PostgreSQL 和 SQLite)如果您愿意使用更长的时间prepare
/bind_param
/execute
/fetch
方法序列,如果您使用 PostgreSQL,则必须小心查询中的数组。What sorts of placeholders (if any) are supported depends on the driver:
But you're in luck, the PostgreSQL driver supports named or numbered parameters:
And the SQLite driver also supports them:
The downside is that you'll end up using
bind_param
a lot with the named parameters so you won't be able to use conveniences likeselectcol_arrayref
and$sth->execute(1,2,3)
(Note: If anyone knows how to use named placeholders withexecute
I'd appreciate some pointers in a comment, I've never figured out how to do it). However, you can use the various forms of number placeholders (such asselect c from t where x = $1
for PostgreSQL orselect c from t where x = ?1
for SQLite).Also be aware that PostgreSQL uses colons for array slices and question marks for some operators so sometimes the standard ? placeholders and :name named placeholders can cause problems. I've never had any problems with ? but I've never used the geometric operators either; I suspect that sensible use of whitespace would avoid any problems with ?. If you're not using PostgreSQL arrays, then you probably don't have to worry about array slices fighting with your
:name
named placeholders.Executive Summary: You can't use named placeholders with
selectcol_arrayref
or similar methods that work with@bind_params
. However, with SQLite and Postgresql, you can use numbered placeholders ($1
,$2
, ... for Postgresql or?1
,?2
, ... for SQLite) with the methods that work with@bind_params
or you can use named placeholders (:name
for both PostgreSQL and SQLite) if you're happy using the longerprepare
/bind_param
/execute
/fetch
sequence of methods and you'll have to be careful if you use PostgreSQL arrays in your queries.