Postgres触发器没有找到返回

时间:2015-07-29 16:15:00

标签: python postgresql triggers sqlalchemy flask-sqlalchemy

这是我的触发器:

CREATE OR REPLACE FUNCTION update_played ()
  RETURNS trigger
AS
$BODY$
  DECLARE
    v_count_played integer;
BEGIN

    SELECT count(*) INTO STRICT v_count_played FROM history WHERE song_id = NEW.song_id;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        RAISE EXCEPTION 'history count for song % not found', NEW.song_id;
      WHEN TOO_MANY_ROWS THEN
        RAISE EXCEPTION 'history count did not aggregate';

    EXECUTE 'UPDATE song SET count_played = $1 WHERE id = $2'
        USING v_count_played, NEW.song_id;

    RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;


create trigger update_played_trigger
after insert on history
for each row
execute procedure update_played();

它给出错误:

  

sqlalchemy.exc.InternalError:(psycopg2.InternalError)控件在没有RETURN的情况下达到了触发程序的结束

1 个答案:

答案 0 :(得分:1)

您误解了EXCEPTION关键字。如果我改变你的缩进以匹配它的工作方式,它可能会帮助你理解。 EXCEPTIONBEGINEND一起显示try {} catch {},就像其他语言中的BEGIN SELECT count(*) INTO STRICT v_count_played FROM history WHERE song_id = NEW.song_id; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE EXCEPTION 'history count for song % not found', NEW.song_id; WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'history count did not aggregate'; EXECUTE 'UPDATE song SET count_played = $1 WHERE id = $2' USING v_count_played, NEW.song_id; RETURN NULL; END; 一样。所以它的工作原理如下:

SELECT

这里发生的是你运行NO_DATA_FOUND。如果RAISE例外,您TOO_MANY_ROWS。如果您RAISE存在RAISE EXCEPTION例外,那么在EXECUTE执行RETURN的{​​{1}}之后,同一块中会出现无法访问的代码SELECT

如果BEGIN BEGIN SELECT count(*) INTO STRICT v_count_played FROM history WHERE song_id = NEW.song_id; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE EXCEPTION 'history count for song % not found', NEW.song_id; WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'history count did not aggregate'; END; EXECUTE 'UPDATE song SET count_played = $1 WHERE id = $2' USING v_count_played, NEW.song_id; RETURN NULL; END; 没有例外,则不再采取进一步行动,程序只退出,不返回任何内容。

我认为你打算写的是:

add_action( 'admin_enqueue_scripts','your_script' );
function your_script() {
wp_enqueue_style( 'style_register', plugins_url( '/css/style.css', __FILE__ ) );
wp_enqueue_script( 'script_register', plugins_url( '/js/admin.js', __FILE__ ) );
}

<input id="the_field" name="the_field" value="your_value" type="text"/>
<input id="meta_update" name="meta_update" class="button updatemeta button-small"  value="Update"/>
<?php $html .= '<span id="ajax_meta_nonce" class="hidden">' . wp_create_nonce( 'ajax_meta_nonce' ) . '</span>'; echo $html; ?>
<span class="ajax_response_span"></span>
相关问题