使用 Play 框架 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 = ''
因此,出于某种原因,Play 试图将 SQL 插入文本列而没有正确转义。有没有其他人找到解决这个问题的方法?您认为这是 JDBC 问题而不是 Play 问题吗?另外,有没有人让 Liquibase 与 Play 2.1 一起工作?
此外,仅将 $$ 更改为 ' 也不起作用。在这种情况下,我们会得到一个不同的错误,但我们仍然无法执行进化。
编辑:我添加了一个来自全新游戏项目的示例。请在以下网址下载:http ://elijah.zupancic.name/files/play_evolution_problem.tar.gz
要使示例正常工作,您需要创建一个新数据库,如进化 1.sql 的第一条评论所示。然后你需要配置你的 conf/application.conf 以在正确的端口和正确的用户上连接到 postgres。
我刚刚做了一个实验,我尝试将创建函数 sql 完全插入到播放框架之外。示例在这里:http ://elijah.zupancic.name/files/PgCreateFunction.tar.gz <
事实证明,它是非常可重复的。
编辑:事实证明我无法在 Java 中重现它。