9

我正在尝试使用 postgres ( pq lib ) 数据库使用Goose创建此函数。

我的代码如下:

   CREATE OR REPLACE FUNCTION add_userlocation(user_id INT, location_id INT) RETURNS VOID AS
   $BODY$
   BEGIN
       LOOP
           UPDATE userslocations SET count = count+1 WHERE userid = user_id AND locationid = location_id;
        IF found THEN
            RETURN;
        END IF;
        BEGIN
            INSERT INTO userslocations(userid,locationid, count) VALUES (user_id, location_id, 1);
               RETURN;
           EXCEPTION WHEN unique_violation THEN
        END;
       END LOOP;
   END;
   $BODY$
   LANGUAGE plpgsql;

当我尝试goose up它时,它会提供一个错误:

(pq: unterminated dollar-quoted string at or near "$BODY$
BEGIN
    LOOP
        -- first try to update the key
        UPDATE userslocations SET count = count+1 WHERE userid = user_id AND locationid = location_id;
"), quitting migration.

Goose 基本上是回显pq库错误,所以我不认为它在 Goose 中,而是在 pq-library 中。查询在 pgAdmin III 上运行成功。

4

1 回答 1

24

根据goose 文档,包含分号的复杂语句必须用-- +goose StatementBeginand注释。-- +goose StatementEnd

您的语句包含嵌入其中的分号,因此您需要使用这些注释。否则 goose 会破坏 SQL,以便 libpq 给出错误。

于 2014-01-06T06:44:59.740 回答