我正在使用libpq与postgres数据库通信。在postgres中,当使用函数PQexecParams和PQprepare时,可以使用占位符,并且可以通过const char指针绑定到值。
我有问题找到关于这个功能的详细解释。例如,考虑这样的查询:
INSERT INTO ... VALUES ($1, $2, $3, $4), ($1, $5, $3, $6), ($1, $7, $3, $8)
其中$1和$3来自多行中使用的单个值,例如int或double和$2,$5,$7来自一个集合,比如vector,而$6,$7,$8来自另一个集合。
占位符是在查询执行时解析以匹配const char偏移量,还是纯粹基于索引,即占位符的索引与char指针上的偏移量匹配?即假设
const char** data
作为数据参数传递到PQexecParams或PQprepare中。以下Map有效:
data[0] -> $1
data[1] -> $2
data[3] -> $3
...
data[7] -> $8
假设我在语句中交换了两个占位符。比如,我切换前两个占位符:
INSERT INTO ... VALUES ($2, $1, $3, $4), ($1, $5, $3, $6), ($1, $7, $3, $8)
请注意,2美元现在是第一位,1美元是第二位。当基于索引时,我期望以下Map:
data[0] -> $2
data[1] -> $1
...
当解析时,我希望原始Map仍然有效,即
data[0] -> $1
data[1] -> $2
哪个是真的?
1条答案
按热度按时间eanckbw91#
这里肯定有一些事情超出了计算占位符和它们的位置:我对一个有两列col1和col2的表进行了以下查询:
这适用于postgres和sqlite。当我用$4替换$2时,它可以在sqlite中使用find,但是我从libpq得到一条错误消息:
错误消息为: