【问题标题】:Postgres PL/Python Initializing record functionsPostgres PL/Python 初始化记录函数
【发布时间】:2018-06-14 16:42:08
【问题描述】:

有没有办法传递到一个被调用以提供默认值的 PL 函数,以及如何使用它以及插入的其余值?

CREATE TABLE tokensStore (
    id SERIAL PRIMARY KEY,
    users INTEGER REFERENCES users(id),
    genDate timestamp with time zone NOT NULL DEFAULT now(),
    expDate timestamp with time zone NOT NULL DEFAULT now() + interval '24 hours', 
    token char(30) NOT NULL DEFAULT tokenGenerator(%%%INSERTED VALUES%%%)   
);

而且我不确定这是一种正确的方法,我不知道我是否应该允许 NULL 值并创建一个触发器来生成令牌的值。

问题是我不想在该列中允许空值。 而且我还想用返回值令牌制作插入,例如

INSERT tokensStore(user) VALUES (1) RETURNING token; 

如果有人对此有很好的参考,将不胜感激。

【问题讨论】:

  • 看来你需要一个触发器。为什么你认为它应该在 plpython 中(而不是在 plpgsql 中)?有关系吗?
  • 我正在使用 Python 编写的加密函数生成令牌,这就是我使用 Python 的原因

标签: database postgresql stored-procedures triggers plpython


【解决方案1】:

你需要一个 plpython 触发器:

create or replace function before_insert_on_tokensstore()
returns trigger language plpython3u as $$

    id = TD["new"]["id"]
    users = TD["new"]["users"]
    TD["new"]["token"] = users * 100 + id

    # 
    # TD["new"]["token"] = generate_token(users, id)
    #
    return "MODIFY"

$$;

create trigger before_insert_on_tokensstore
before insert on tokensstore
for each row execute procedure before_insert_on_tokensstore();

示例用法:

insert into tokensstore(users) 
values (1) 
returning token; 

             token              
--------------------------------
 101                           
(1 row)

INSERT 0 1  

当然,使用触发器,您不需要token 的默认值。

了解PL/Python Trigger Functions.

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多