Eli*_*jah 9 postgresql jdbc postgresql-9.2 playframework-2.1 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] = anyElement
LIMIT 1; $$ LANGUAGE sql IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
当我执行演变时,我收到以下错误:
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:
Run Code Online (Sandbox Code Playgroud)
我正在使用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 = ''
Run Code Online (Sandbox Code Playgroud)
因此,出于某种原因,Play正在尝试将SQL插入到文本列中而不会正确转义.还有其他人为此找到了解决方法吗?你认为这是一个JDBC问题而不是Play问题吗?还有,有人让Liquibase与Play 2.1合作吗?
此外,只是将$$更改为'也不起作用.在这种情况下,我们得到一个不同的错误,但我们仍然无法执行演变.
编辑:我添加了一个全新的游戏项目的例子.请下载:http://elijah.zupancic.name/files/play_evolution_problem.tar.gz
要使示例正常工作,您需要创建一个新的数据库,如evolution 1.sql的第一条注释所示.然后,您需要配置conf/application.conf以连接到正确端口上的postgres并使用正确的用户.
我刚刚做了一个实验,我尝试在play框架之外完全插入create function sql.示例如下:http://elijah.zupancic.name/files/PgCreateFunction.tar.gz <
事实证明它非常可重复.
编辑:事实证明,我不能用Java重现它.
Bri*_*per 19
这是Play分析演变的工件.由于它解析分号上的每个语句,因此无法处理存储过程定义.Play 2.1中解决了这个问题,允许您通过加倍来指定嵌入的分号.例如,请参阅https://github.com/playframework/Play20/pull/649.
使用;;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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1992 次 |
| 最近记录: |