【Postgresql】随手记:创建时间、更新时间数据库端自动实现更新

9 篇文章 0 订阅
6 篇文章 0 订阅

postgresql数据表中
字段 解释
id: 自增数字;
name:字符串;
create_at:记录创建数据的时间;
update_at:记录更新记录的时间;

想法:
create_at 和 update_at 字段用于记录记录的创建和更新时间,可以通过数据库的默认值和触发器来实现自动处理这些时间戳字段,而不需要在 Python 后端每次请求时手动传递这些参数。

1.创建 create_at 字段的默认值:
在创建表时,可以为 create_at 字段设置默认值为当前时间,这样在插入新记录时,create_at 字段会自动记录创建时间。

CREATE TABLE your_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_at TIMESTAMP
);

2.使用触发器自动更新 update_at 字段:
可以创建一个触发器(Trigger),在更新记录时自动将 update_at 字段设置为当前时间。

首先,创建一个触发器函数:

CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    NEW.update_at = CURRENT_TIMESTAMP;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

然后,创建触发器来调用这个函数:

CREATE TRIGGER update_timestamp_trigger
BEFORE UPDATE ON your_table
FOR EACH ROW
EXECUTE PROCEDURE  update_timestamp();

效果:
当插入一条新记录时,create_at 字段会自动设置为当前时间,update_at 字段保持为空或可以初始化为 NULL。
当更新一条记录时,update_at 字段会自动设置为当前时间。

遇到问题:

1.在创建触发器调用函数时使用 EXECUTE PROCEDURE 出现报错:SQL 错误 [42601]: ERROR: syntax error at or near “FUNCTION” Position: 90

原因:
PostgreSQL 11 及更早版本需要使用 EXECUTE PROCEDURE。
查看版本:
SELECT version();

PostgreSQL 10.23 (Ubuntu 10.23-0ubuntu0.18.04.2) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit

解决方法:
使用 EXECUTE PROCEDURE 代替 EXECUTE FUNCTION
在 PostgreSQL 11 及更早的版本中,触发器语法使用 EXECUTE PROCEDURE 而不是 EXECUTE FUNCTION。更新你的触发器创建语句如下:
CREATE TRIGGER update_timestamp_trigger
BEFORE UPDATE ON your_table
FOR EACH ROW
EXECUTE PROCEDURE update_timestamp();

from sqlalchemy import Column, Integer, String, DateTime, func
from db.base_class import Base


class Demo(Base):
    # 表的名字:
    __tablename__ = 'demo'

    id = Column(Integer, autoincrement=True, primary_key=True, unique=True, index=True)
    name = Column(String(32))
    create_at = Column(DateTime, default=func.now())
    update_at = Column(DateTime, onupdate=func.now())
	
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔都吴所谓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值