代码之家  ›  专栏  ›  技术社区  ›  Matheus Dias de Souza

PostgreSQL上事务语句的函数

  •  0
  • Matheus Dias de Souza  · 技术社区  · 4 年前

    networkId recoyx.user )和一个用户私有表( recoyx_private.user PostGraphile tutorial

    create function recoyx.authenticate(
        network_id text,
        password_hash text
    ) returns recoyx.jwt_token
    begin;
        set local id to (select (numeric_id) from recoyx.user where user.network_id = $1).numeric_id;
        select (numeric_id, password_hash)::recoyx.jwt_token
            from recoyx_private.user
            where user.numeric_id = id and user.password_hash = $2;
    end;
    

    查询运行程序在这个函数中给出了无效的语法,包括 select * from recoyx.table where table.field = value id 结合。我从这个 example 这给了我们一个简短的回答 postgraphile module API documentation ).

    当我从查询中删除此函数时,它运行良好。据我所知,点是有效的,本地赋值也是有效的。我的语法真的错了吗?

    更新

    create function recoyx.authenticate(
        network_id text,
        password_hash text
    ) returns recoyx.jwt_token
    as
    $body$
        select (numeric_id, password_hash)::recoyx.jwt_token
            from recoyx_private.user
            where   numeric_id = (select numeric_id from recoyx.user where network_id = $1)
                and password_hash = $2;
    $body$
    language sql
    stable;
    

    我得到的是未定义的关系,但我正在连接到PostgreSQL安装中的默认根角色( postgres create function 查询

    我已经把这个计划付诸实施了 GitHub . 我正在运行查询 npm run init-database . 看到了吗 environment-example.json (它指定了传统的“postgres”角色)。

    1 回复  |  直到 4 年前
        1
  •  2
  •   a_horse_with_no_name    4 年前

    As documented in the manual 函数体在Postgres中作为字符串传递(您链接到的教程实际上包含了必要的 as $$ ...$$ -你只是没有复制它)。您还忘了指定函数的语言。

    set local id PL/pgSQL 在SQL中也是如此(SQL没有变量开头)。

    create function recoyx.authenticate(
        network_id text,
        password_hash text
    ) returns recoyx.jwt_token
    as
    $body$
      select (numeric_id, password_hash)::recoyx.jwt_token
      from recoyx_private.user
      where user.numeric_id = (select numeric_id 
                               from recoyx.user 
                               where network_id = $1)
        and user.password_hash = $2;
    $body$
    language sql
    stable;