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

devtools/2024/10/15 20:22:51/

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())

http://www.ppmy.cn/devtools/97925.html

相关文章

【微服务】springboot 整合表达式计算引擎 Aviator 使用详解

目录 一、前言 二、表达式计算框架概述 2.1 规则引擎 2.1.1 什么是规则引擎 2.1.2 规则引擎用途 2.1.3 规则引擎使用场景 2.2 表达式计算框架 2.2.1 表达式计算框架定义 2.2.2 表达式计算框架特点 2.2.3 表达式计算框架应用场景 2.3 表达式计算框架与规则引擎异同点 …

优化WAN流量:如何通过调整系统设置降低企业网络成本

一、症状与问题背景 当电脑显示空闲状态时,如果满足以下条件,第二拨号链接可能会意外激活: 您正在使用基于 Microsoft Windows 的计算机,该计算机连接到远程网络并且是 Active Directory 域服务 (AD DS) 域的成员。 您通过二级…

防火墙技术原理与应用

防火墙概述 防火墙概念 防火墙:通过一种网络安全设备,控制安全区域间的通信,隔离有害通信,进而阻断网络攻击。一般安装在不同安全区域边界处,用于网络通信安全控制,由专用硬件或软件系统组成。 根据网络安全信任程度和需保护的对象,划分安全区域 公共外部网络:Inter…

QT聊天室基于Tcp

server.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this)) // 给服务器指针对象实例化空间{ui->setupUi(this); }Widget::~Widget() {delete ui; }…

回溯算法(基于Python)

递归 递归(recursion)是一种算法策略,通过函数调用自身来解决问题。"递"指程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。"归"指触发终止条件后,程序从最深层的递归函数开始逐层…

波导阵列天线单元 学习笔记3 基于空气填充双模馈网的双圆极化膜片天线阵列

摘要: 此通信提出了一种使用空气填充双模馈网的基于膜片极化器的双圆极化天线阵列。一种1分4的圆腔单层覆盖在膜片极化器上来抑制栅瓣。全公司馈网被一个双模传输线所实现,以此在一组馈网内联合了TEM模式(由HW悬架线激励)和TE10模…

Transformer(课程笔记)

一:Motivation RNN需要顺序的执行,不利于并行计算。 RNN的变体例如GRU、LSTM等需要依靠注意力机制解决信息瓶颈等问题。 抛弃RNN结构,提出了Transformer结构。 Transformer整体架构 二: 输入层(BPE,PE&…

Vue:Treeselect基本使用

官网 属性配置 属性含义备注:options数据列表数据格式一定要与下面的对应起来:multiple是否多选当多选的时候&#xff0c;接收参数一定要定义成列表类型searchable可搜索:limitText显示每一组的数量:disable-branch-nodes禁止选中父级 案例 <template><div class&…