Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

PostgreSQL 类型

启用 postgres Cargo feature 后使用 SQLx 原生 PostgreSQL 连接池。derive 支持的常见模型类型 见模型;这不代表 SQLx 可编码的所有类型都能用于模型。

标量字段映射

Rust 模型类型PostgreSQL 列类型
boolBOOLEAN
i16、i32、i64SMALLINT、INTEGER、BIGINT
f32、f64REAL、DOUBLE PRECISION
StringTEXT
Vec<u8>BYTEA
serde_json::ValueJSONB
uuid::Uuid(uuid)UUID
chrono/time 日期时间类型DATE、TIME、TIMESTAMP 或 TIMESTAMPTZ
rust_decimal::Decimal、bigdecimal::BigDecimalNUMERIC
IpAddr、IpNetwork、IpNetINET
MacAddressMACADDR
BitVecBIT VARYING

Rust Option<T> 对应可空列。日期时间、UUID、decimal、网络、MAC 和 bit-vector 类型需要启用 对应 Cargo feature。

sqlx::postgres::types::PgInterval 目前仅支持作为 PgArray 元素,不能独立作为派生模型字段。 其他 SQLx PostgreSQL 专有标量类型也不会自动成为 derive 可用类型。

数组

PostgreSQL 数组字段使用 PgArray<T>。支持的元素类型:

  • 始终可用:bool、i8、i16、i32、i64、f32、f64、String、 serde_json::Value 和 PgInterval。
  • uuid:uuid::Uuid。
  • chrono:NaiveDate、NaiveTime、NaiveDateTime、DateTime<Utc> 和 DateTime<FixedOffset>。
  • time:Date、Time、PrimitiveDateTime、OffsetDateTime。
  • rust_decimal / bigdecimal:对应 decimal 类型。
  • ipnetwork:IpAddr、IpNetwork;ipnet:IpAddr、IpNet。
  • mac_address:MacAddress;bit-vec:BitVec。

PgArray<Option<T>> 表示非空数组中的 NULL 元素;Option<PgArray<T>> 表示数组列本身可空; 空数组使用空的 PgArray 表示。数组通过文本形式编码,并绑定显式元素类型转换,仅用于上列内置 元素实现。单独实现 PgArrayElement 不会自动支持任意自定义 PostgreSQL 类型。

范围

使用 PgRange<T> 表示 PostgreSQL 范围:

Rust 元素类型PostgreSQL 范围类型
i32INT4RANGE
i64INT8RANGE
chrono::NaiveDate 或 time::DateDATERANGE
chrono::NaiveDateTime 或 time::PrimitiveDateTimeTSRANGE
chrono::DateTime<Utc> / DateTime<FixedOffset> 或 time::OffsetDateTimeTSTZRANGE
rust_decimal::Decimal 或 bigdecimal::BigDecimalNUMRANGE

可通过 PgRange::from(1_i32..10) 转换 Rust 标准范围,也可用 PgRange::new(Bound, Bound) 指定端点是否包含及无界端点。Option<PgRange<T>> 表示 NULL 范围列。当前不支持自定义范围类型。

PostgreSQL 行为与限制

  • 自增主键使用 BIGINT GENERATED BY DEFAULT AS IDENTITY。
  • JSON 使用 JSONB,decimal 使用 NUMERIC。
  • 网络、MAC 和 bit-vector 字段使用 PostgreSQL 原生类型;SQLite 不提供相同的操作符和语义。
  • PostgreSQL 模型元数据为数组和范围提供显式列类型。
  • schema 迁移生成器用于列删除/类型变更比较的解析器目前只识别 INTEGER、BIGINT、 REAL、DOUBLE PRECISION、TEXT、BOOLEAN 和 JSONB。类型变更还要求约束未变化且没有 主键或唯一约束。生成语句会显式转换类型,应用前应检查数据及双向转换。
  • derive 不支持 PostgreSQL 用户自定义 enum 和 composite 字段。

更多字段属性见模型,迁移细节见数据库迁移。