PostgreSQL data types
timestamptz vs timestamp
TLDR You should prefer using timestamptz
over timestamp
. None of the types store the provided timezone, but timestamptz
at least properly parses the time with a timezone. To save user timezone, create a separate column for it.
Let's use the following table as an example:
CREATE TABLE test (
t1 timestamptz,
t2 timestamp
);
The first difference between timestamptz
and timestamp
is that timestamp
discards/ignores the provided timezone:
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
also ignores the server/session timezone:
SET timezone = 'America/Los_Angeles';
The result:
SELECT * FROM test;
t1 | t2
------------------------+---------------------
2020-12-31 16:00:00-08 | 2021-01-01 02:00:00
JSONB
Bun uses JSONB
data type to store maps and slices. To change the default type, use type
struct tag option:
type Model struct {
Data map[string]interface{} `bun:"type:jsonb"`
}
To enable json.Decoder.UseNumber
option:
type Model struct {
Data map[string]interface{} `bun:",json_use_number"`
}
You can also use json.RawMessage
to work with raw bytes:
type Model struct {
Data json.RawMessage `bun:"type:jsonb"`
}
Arrays
See Working with PostgreSQL arrays.
UUID
See Generating UUIDs in PostgreSQL.
See also
See Don't do this for more tips.