You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL插入时:分格式_time类型值的正确写法

核心原因

PostgreSQL 内置类型中,以下划线开头的类型名均为对应普通类型的数组类型的内部别名,不建议在业务SQL中直接使用,容易引发类型混淆。你建表时写的_time实际等价于TIME[],也就是时间值数组类型,不是存储单个时分值的普通时间类型。
报错提示要求值以{开头,是数组类型的固定格式校验规则:PostgreSQL 数组字面量必须以大括号包裹内部元素,你传入的'17:30'是单个标量时间值,和数组字段类型不匹配,必然触发报错。
你之前尝试加{}未生效,通常是写法不符合数组格式要求,比如给数组内的时间值额外套了单引号、括号和值之间存在非法空格或符号。

正确写法

根据实际存储需求二选一即可:

场景1:字段仅需存储单个时分格式的时间值

这是绝大多数业务的使用场景,直接把建表语句里的_time替换为普通TIME类型即可,原有插入语句不需要调整:

-- 修正后的建表语句
CREATE TABLE IF NOT EXISTS test_time (time_col TIME);
-- 原插入语句可正常执行
INSERT INTO test_time(time_col) VALUES('17:30');

执行成功后字段会存储17:30:00格式的时间值。

场景2:字段确实需要存储多个时间值(时间数组)

保留_time(即TIME[])类型,插入时使用标准数组格式即可:

-- 插入仅含1个时间值的数组
INSERT INTO test_time(time_col) VALUES('{17:30}');

-- 插入含多个时间值的数组
INSERT INTO test_time(time_col) VALUES('{08:45, 12:00, 18:30}');

也可以用ARRAY构造器写法,容错性更好,不容易写错格式:

INSERT INTO test_time(time_col) VALUES(ARRAY['17:30'::TIME, '09:15'::TIME]);
SQLAlchemy 适配提示

用SQLAlchemy做ORM映射时,不要手动指定_time这个内部类型名:

  • 存单个时间值,字段类型直接用sqlalchemy.Time
  • 存时间数组,字段类型用sqlalchemy.ARRAY(sqlalchemy.Time)
    框架会自动处理类型转换和格式拼接,不需要手动拼接数组格式字符串。

内容的提问来源于stack exchange,提问作者Mefitico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:21:23