PostgreSQL 数据类型

timestamptz vs timestamp

TLDR 您应该优先使用 timestamptz 而不是 timestamp。这两种类型都不存储提供的时区,但 timestamptz 至少可以正确解析带有时区的日期。要保存用户时区,请为其创建一个单独的列。


让我们以以下表格为例

CREATE TABLE test (
  t1 timestamptz,
  t2 timestamp
);

timestamptztimestamp 之间的第一个区别是 timestamp 会丢弃/忽略提供的时区

INSERT INTO test VALUES ('2021-01-01 02:00:00+02', '2021-01-01 02:00:00+02') RETURNING *;

           t1           |         t2
------------------------+---------------------
 2021-01-01 00:00:00+00 | 2021-01-01 02:00:00

timestamp 还会忽略服务器/会话时区

SET timezone = 'America/Los_Angeles';

结果

SELECT * FROM test;

           t1           |         t2
------------------------+---------------------
 2020-12-31 16:00:00-08 | 2021-01-01 02:00:00

JSONB

Bun 使用 JSONB 数据类型来存储映射和切片。要更改默认类型,请使用 type 结构体标签选项

type Model struct {
	Data map[string]interface{} `bun:"type:jsonb"`
}

要启用 json.Decoder.UseNumber 选项

type Model struct {
	Data map[string]interface{} `bun:",json_use_number"`
}

您也可以使用 json.RawMessage 来处理原始字节

type Model struct {
	Data json.RawMessage `bun:"type:jsonb"`
}

数组

参见 使用 PostgreSQL 数组.

UUID

参见 在 PostgreSQL 中生成 UUID.

另请参阅

参见 不要这样做在新窗口中打开 获取更多提示。