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 $$
BEGINNEW.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 Baseclass 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())