如何使用Play框架中的evolutions在PostgreSQL中创建函数?

如何使用Play框架中的evolutions在PostgreSQL中创建函数?,postgresql,jdbc,playframework-2.1,postgresql-9.2,playframework-evolutions,Postgresql,Jdbc,Playframework 2.1,Postgresql 9.2,Playframework Evolutions,使用Play Framework 2.1 我在进化过程中定义了以下SQL: CREATE OR REPLACE FUNCTION idx(myArray anyarray, myElement anyelement) RETURNS int AS $$ SELECT i FROM ( SELECT generate_series(array_lower(myArray,1),array_upper(myArray,1)) ) g(i) WHERE myArray[i] = anyEle

使用Play Framework 2.1

我在进化过程中定义了以下SQL:

CREATE OR REPLACE FUNCTION idx(myArray anyarray, myElement anyelement) RETURNS int AS $$
 SELECT i FROM (
  SELECT generate_series(array_lower(myArray,1),array_upper(myArray,1))
 ) g(i)
 WHERE myArray[i] = anyElement
 LIMIT 1; $$ LANGUAGE sql IMMUTABLE;
当我执行演化时,我得到以下错误:

We got the following error: ERROR: unterminated dollar-quoted string at or near 
"$$ SELECT i FROM ( SELECT generate_series(array_lower(myArray,1),
 array_upper(myArray,1)) ) g(i) WHERE myArray[i] = anyElement LIMIT 1" Position:
 87 [ERROR:0, SQLSTATE:42601], while trying to run this SQL script:
我使用的是PostgreSQL驱动程序版本9.1-901.jdbc4

我查看了postgres查询日志,发现Play正在尝试执行以下操作:

LOG:  execute <unnamed>: insert into play_evolutions values($1, $2, $3, $4, $5, $6, $7)
PST DETAIL:  parameters: $1 = '1',
                         $2 = 'c834d463ebd9916b0a3388040300a0926514faef',
                         $3 = '2013-03-05 00:00:00',
                         $4 = '-- THE EVOLUTION UP STATEMENTS GO HERE',
                         $5 = '-- THE EVOLUTION DOWN STATEMENTS GO HERE',
                         $6 = 'applying_up',
                         $7 = ''
LOG:execute:insert-to-play\u进化值($1、$2、$3、$4、$5、$6、$7)
PST详细信息:参数:$1='1',
$2='c834d463ebd9916b0a3388040300a0926514faef',
$3 = '2013-03-05 00:00:00',
$4='--EVOLUTION UP语句放在这里',
$5='--EVOLUTION DOWN语句放在这里',
$6=‘申请’,
$7 = ''
因此,出于某种原因,Play试图在没有正确转义的情况下将SQL插入文本列。还有其他人为此找到工作吗?你认为这是JDBC的问题而不是游戏的问题吗?还有,有没有人让Liquibase使用Play 2.1

此外,仅将$$更改为也不起作用。在这种情况下,我们会得到一个不同的错误,但我们仍然无法执行进化

编辑:我添加了一个来自全新play项目的示例。请下载:

要使示例正常工作,您需要创建一个新数据库,如evolution 1.sql上的第一条注释所示。然后,您需要配置conf/application.conf,以使用正确的端口和用户连接到postgres


我刚刚做了一个实验,尝试将create函数sql完全插入play框架之外。示例如下:这是Play如何解析进化的工件。由于它以分号解析每条语句,因此无法处理存储过程定义。游戏2.1解决了这个问题,允许您通过将分号加倍来指定嵌入的分号。例如,见

使用
使用Play 2.1为我解决了一个类似的问题。我建议你重新定义你的进化如下,然后再试一次:

CREATE OR REPLACE FUNCTION idx(myArray anyarray, myElement anyelement) RETURNS int AS $$
 SELECT i FROM (
  SELECT generate_series(array_lower(myArray,1),array_upper(myArray,1))
 ) g(i)
 WHERE myArray[i] = anyElement
 LIMIT 1;; $$ LANGUAGE sql IMMUTABLE;

您看到的是Pg的调试输出,显示参数化查询及其参数。每个参数都通过fe/be协议单独发送,客户端无需转义。您在这里看到的问题几乎可以肯定只有Pg使用
'
无条件地调试参数表示;实际参数可以。如果无法转义,您将看到一个大的SQL查询,所有参数都被替换到其中。在多语句分离期间,您更可能遇到解析美元引号的PgJDBC问题。一个自包含的可编译示例会很有帮助。如果你在编辑中添加了详细信息,请在这里发表评论,以便我得到通知。嗨,克雷格,我已经按照你的要求添加了SSCCE。看一看。它确实是在我能创建的最简单的游戏设置中复制的。我不说游戏-我知道Maven和Ant项目结构,但游戏使用它自己的。你是怎么运作的?自述文件只是默认生成的。请安装play框架。然后输入:play-run