создать функцию незавершенной строки в долларовых кавычках

Я пытаюсь создать эту функцию с помощью Goose, используя postgres (pq lib).

Мой код выглядит следующим образом:

   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-библиотеке. Запрос выполняется успешно на pgAdmin III.


person puredevotion    schedule 05.01.2014    source источник
comment
Если вы вставите определение функции непосредственно в psql, оно сработает?   -  person harmic    schedule 06.01.2014
comment
Да, я использовал окно запроса в pgAdmin III, куда вставил код и выполнил его. Это сработало, и я могу использовать его с моей библиотекой go-app/pq (exec("Select add_userlocation(1,1)"))   -  person puredevotion    schedule 06.01.2014
comment
Это означает, что гусь должен изменить текст перед передачей его в libpq. Делает ли он какую-либо интерпретацию входных строк?   -  person harmic    schedule 06.01.2014


Ответы (1)


Согласно документации гуся, сложные операторы, содержащие точки с запятой, должны быть аннотированы -- +goose StatementBegin и -- +goose StatementEnd.

Ваше заявление содержит встроенные в него точки с запятой, поэтому вам необходимо использовать эти аннотации. В противном случае гусь искажает SQL так, что libpq выдает ошибки.

person harmic    schedule 06.01.2014
comment
Вы меня спасли своим ответом :-) - person Arkan; 11.07.2014