如何能在水晶中向Postgres发送毫无准备的声明?

时间:2018-03-18 19:01:58

标签: crystal-lang

是否可以向Postgres连接发送未准备好的语句(使用crystal-dbcrystal-pg分片)?

我尝试使用.query方法运行以下语句,但它们失败了,因为它们使用prepared statement,这会阻止多个语句运行。也许unprepared statement会起作用吗?:

 SET LOCAL my.val = 'abc';
 SELECT current_setting('my.val') as my_val, 'aa' as now_;

1 个答案:

答案 0 :(得分:0)

PG分片允许:"扩展查询"协议(使用准备好的语句并允许参数),以及简单的查询"协议(没有返回值的多个语句)。

为了防止出现一些问题,分片作者决定只使用"扩展查询返回结果"协议。因此,您唯一的另一种选择是使用"扩展查询"在交易中。这将允许多个语句(例如SET,SELECT等):

DB.open(uri) do |db|
  db.transaction { |tx|
    tx.connection.exec "SET LOCAL my.val = 'abc';"
    puts tx.connection.scalar("SELECT current_setting('my.val') as my_val;").inspect
  }
  db.transaction { |tx|
    puts tx.connection.scalar("SELECT current_setting('my.val') as my_val;").inspect
  }
end

输出:

"abc"
""

来源:https://github.com/will/crystal-pg/issues/139