使用Play Framework 2.1,我在数据库演化(evolution)中定义了以下SQL语句:
当我执行进化时,出现以下错误:
我正在使用PostgreSQL驱动程序版本9.1-901.jdbc4。
我查看了postgres查询日志并发现Play试图执行以下操作:
因为某些原因,Play正在尝试在文本列中插入未经适当转义的SQL。有其他人找到解决方法吗?您认为这是JDBC问题而不是Play问题吗?此外,有人已经成功地将Liquibase与Play 2.1一起使用了吗?
另外,仅更改$$为'也不起作用。在这种情况下,我们会得到不同的错误,但我们仍然无法执行演化。
编辑:我已经添加了一个全新的play项目示例。请下载:http://elijah.zupancic.name/files/play_evolution_problem.tar.gz 要使示例工作,您需要像演化1.sql上的第一条评论中所示那样创建一个新数据库。然后,您需要配置conf/application.conf以连接到正确端口和具有正确用户的postgres。
我刚刚进行了一个实验,尝试在Play框架之外完全插入创建函数SQL。示例在此处:http://elijah.zupancic.name/files/PgCreateFunction.tar.gz<。
结果发现这是非常可复制的。
编辑:事实证明我无法在Java中复制它。
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一起使用了吗?
另外,仅更改$$为'也不起作用。在这种情况下,我们会得到不同的错误,但我们仍然无法执行演化。
编辑:我已经添加了一个全新的play项目示例。请下载:http://elijah.zupancic.name/files/play_evolution_problem.tar.gz 要使示例工作,您需要像演化1.sql上的第一条评论中所示那样创建一个新数据库。然后,您需要配置conf/application.conf以连接到正确端口和具有正确用户的postgres。
我刚刚进行了一个实验,尝试在Play框架之外完全插入创建函数SQL。示例在此处:http://elijah.zupancic.name/files/PgCreateFunction.tar.gz<。
结果发现这是非常可复制的。
编辑:事实证明我无法在Java中复制它。
$$
替换为$BODY$
。 - Mark Rotteveelpre.execute
测试,它会正常执行,并按预期创建行。 - Craig Ringer