代码之家  ›  专栏  ›  技术社区  ›  ekiim

postgres pl/python初始化记录函数

  •  1
  • ekiim  · 技术社区  · 7 年前

    有没有一种方法可以传递到一个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%%%)   
    );
    

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

    问题是我不想在该列中允许空值。 我还想用返回值标记进行插入,比如

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

    如果有人对此有很好的推荐信,我们将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  0
  •   klin    7 年前

    您需要一个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.