Skip to main content

Type

Trait Type 

pub trait Type<DB>
where DB: Database,
{ // Required method fn type_info() -> <DB as Database>::TypeInfo; // Provided method fn compatible(ty: &<DB as Database>::TypeInfo) -> bool { ... } }
Expand description

Indicates that a SQL type is supported for a database.

§Compile-time verification

Type definitions are not verified against the database at compile-time. The query!() macros have no implicit knowledge of user-defined types.

When using custom types in query parameters or output columns with query!(), the use of type overrides is required.

struct MyUser { id: UserId, name: String }

// fetch all properties from user and override the type in Rust for `id`
let user = query_as!(MyUser, r#"SELECT users.*, id as "id: UserId" FROM users"#)
    .fetch_one(&pool).await?;

§Derivable

This trait can be derived by SQLx to support Rust-only wrapper types, enumerations, and (for postgres) structured records. Additionally, an implementation of Encode and Decode is generated.

§Transparent

Rust-only domain wrappers around SQL types. The generated implementations directly delegate to the implementation of the inner type.

#[derive(sqlx::Type)]
#[sqlx(transparent)]
struct UserId(i64);
§Note: PgHasArrayType

If you have the postgres feature enabled, this derive also generates a PgHasArrayType impl so that you may use it with Vec and other types that decode from an array in Postgres:

let user_ids: Vec<UserId> = sqlx::query_scalar("select '{ 123, 456 }'::int8[]")
   .fetch(&mut pg_connection)
   .await?;

However, if you are wrapping a type that does not implement PgHasArrayType (e.g. Vec itself, because we don’t currently support multidimensional arrays), you may receive an error:

#[derive(sqlx::Type)] // ERROR: `Vec<i64>` does not implement `PgHasArrayType`
#[sqlx(transparent)]
struct UserIds(Vec<i64>);

To remedy this, add #[sqlx(no_pg_array)], which disables the generation of the PgHasArrayType impl:

#[derive(sqlx::Type)]
#[sqlx(transparent, no_pg_array)]
struct UserIds(Vec<i64>);
§Attributes
  • #[sqlx(type_name = "<SQL type name>")] on struct definition: instead of inferring the SQL type name from the inner field (in the above case, BIGINT), explicitly set it to <SQL type name> instead. May trigger errors or unexpected behavior if the encoding of the given type is different than that of the inferred type (e.g. if you rename the above to VARCHAR). Affects Postgres only.
  • #[sqlx(rename_all = "<strategy>")] on struct definition: See derive docs in FromRow
  • #[sqlx(no_pg_array)]: do not emit a PgHasArrayType impl (see above).

§Enumeration

Enumerations may be defined in Rust and can match SQL by integer discriminant or variant name.

With #[repr(_)] the integer representation is used when converting from/to SQL and expects that SQL type (e.g., INT). Without, the names of the variants are used instead and expects a textual SQL type (e.g., VARCHAR, TEXT).

#[derive(sqlx::Type)]
#[repr(i32)]
enum Color { Red = 1, Green = 2, Blue = 3 }
#[derive(sqlx::Type)]
#[sqlx(type_name = "color")] // only for PostgreSQL to match a type definition
#[sqlx(rename_all = "lowercase")]
enum Color { Red, Green, Blue }

§Records

User-defined composite types are supported through deriving a struct.

This is only supported for PostgreSQL.

#[derive(sqlx::Type)]
#[sqlx(type_name = "interface_type")]
struct InterfaceType {
    name: String,
    supplier_id: i32,
    price: f64
}

Required Methods§

fn type_info() -> <DB as Database>::TypeInfo

Returns the canonical SQL type for this Rust type.

When binding arguments, this is used to tell the database what is about to be sent; which, the database then uses to guide query plans. This can be overridden by Encode::produces.

A map of SQL types to Rust types is populated with this and used to determine the type that is returned from the anonymous struct type from query!.

Provided Methods§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

Determines if this Rust type is compatible with the given SQL type.

When decoding values from a row, this method is checked to determine if we should continue or raise a runtime type mismatch error.

When binding arguments with query! or query_as!, this method is consulted to determine if the Rust type is acceptable.

Defaults to checking [TypeInfo::type_compatible()].

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

§

impl Type<Postgres> for bool

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for f32

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for f64

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for i8

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for i16

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for i32

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for i64

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for str

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl Type<Postgres> for ()

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl Type<Postgres> for String

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl Type<Postgres> for ActivityProgress

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ApplicationTask

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ApplicationType

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for CertificateTextAnchor

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ChapterLockingStatus

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for CourseAiPolicy

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for CourseBackgroundQuestionType

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for CourseDesignerPlanStageStatus

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for CourseDesignerPlanStatus

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for CourseDesignerStage

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for Digest

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for EmailTemplateType

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ErrorSource

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ExerciseRepositoryStatus

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for GradingProgress

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for GrantTypeName

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for HistoryChangeReason

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for MessageRole

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ModelType

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for Oid

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PaperSize

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PeerOrSelfReviewQuestionType

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PeerReviewProcessingStrategy

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgBox

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgCiText

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl Type<Postgres> for PgCircle

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgCube

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgHstore

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgInterval

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgLQuery

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgLSeg

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgLTree

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgLine

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgMoney

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgPath

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgPoint

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgPolygon

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PgRange<i32>

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl Type<Postgres> for PgRange<i64>

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl Type<Postgres> for PgRange<NaiveDate>

Available on crate feature chrono only.
§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl Type<Postgres> for PgRange<NaiveDateTime>

Available on crate feature chrono only.
§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl Type<Postgres> for PgTimeTz

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for PkceMethod

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ProposalStatus

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ReasoningEffortLevel

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ReportReason

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ReviewingStage

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for SuspectedCheaterStatus

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for TeacherDecisionType

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for TokenEndpointAuthMethod

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for TokenType

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for ToolKind

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for UserPointsUpdateStrategy

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for UserRole

§

fn type_info() -> PgTypeInfo

§

impl Type<Postgres> for VerbosityLevel

§

fn type_info() -> PgTypeInfo

§

impl<DB> Type<DB> for NonZero<i8>
where DB: Database, i8: Type<DB>,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<DB> Type<DB> for NonZero<i16>
where DB: Database, i16: Type<DB>,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<DB> Type<DB> for NonZero<i32>
where DB: Database, i32: Type<DB>,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<DB> Type<DB> for NonZero<i64>
where DB: Database, i64: Type<DB>,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<DB> Type<DB> for NonZero<u8>
where DB: Database, u8: Type<DB>,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<DB> Type<DB> for NonZero<u16>
where DB: Database, u16: Type<DB>,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<DB> Type<DB> for NonZero<u32>
where DB: Database, u32: Type<DB>,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<DB> Type<DB> for NonZero<u64>
where DB: Database, u64: Type<DB>,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<T1> Type<Postgres> for (T1,)

§

fn type_info() -> PgTypeInfo

§

impl<T1, T2> Type<Postgres> for (T1, T2)

§

fn type_info() -> PgTypeInfo

§

impl<T1, T2, T3> Type<Postgres> for (T1, T2, T3)

§

fn type_info() -> PgTypeInfo

§

impl<T1, T2, T3, T4> Type<Postgres> for (T1, T2, T3, T4)

§

fn type_info() -> PgTypeInfo

§

impl<T1, T2, T3, T4, T5> Type<Postgres> for (T1, T2, T3, T4, T5)

§

fn type_info() -> PgTypeInfo

§

impl<T1, T2, T3, T4, T5, T6> Type<Postgres> for (T1, T2, T3, T4, T5, T6)

§

fn type_info() -> PgTypeInfo

§

impl<T1, T2, T3, T4, T5, T6, T7> Type<Postgres> for (T1, T2, T3, T4, T5, T6, T7)

§

fn type_info() -> PgTypeInfo

§

impl<T1, T2, T3, T4, T5, T6, T7, T8> Type<Postgres> for (T1, T2, T3, T4, T5, T6, T7, T8)

§

fn type_info() -> PgTypeInfo

§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> Type<Postgres> for (T1, T2, T3, T4, T5, T6, T7, T8, T9)

§

fn type_info() -> PgTypeInfo

§

impl<T> Type<Postgres> for [T]
where T: PgHasArrayType,

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl<T> Type<Postgres> for Vec<T>
where T: PgHasArrayType,

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl<T, DB> Type<DB> for Cow<'_, T>
where DB: Database, T: Type<DB> + ToOwned + ?Sized,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<T, DB> Type<DB> for Option<T>
where T: Type<DB>, DB: Database,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<T, DB> Type<DB> for &T
where T: Type<DB> + ?Sized, DB: Database,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<T, DB> Type<DB> for Box<T>
where DB: Database, T: Type<DB> + ?Sized,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<T, DB> Type<DB> for Rc<T>
where DB: Database, T: Type<DB> + ?Sized,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<T, DB> Type<DB> for Arc<T>
where DB: Database, T: Type<DB> + ?Sized,

§

fn type_info() -> <DB as Database>::TypeInfo

§

fn compatible(ty: &<DB as Database>::TypeInfo) -> bool

§

impl<T, const N: usize> Type<Postgres> for [T; N]
where T: PgHasArrayType,

§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

§

impl<Tz> Type<Postgres> for PgRange<DateTime<Tz>>
where Tz: TimeZone,

Available on crate feature chrono only.
§

fn type_info() -> PgTypeInfo

§

fn compatible(ty: &PgTypeInfo) -> bool

Implementors§

§

impl Type<Postgres> for NaiveDate

§

impl Type<Postgres> for NaiveDateTime

§

impl Type<Postgres> for NaiveTime

§

impl Type<Postgres> for TimeDelta

Available on crate feature chrono only.
§

impl Type<Postgres> for DbSecret

§

impl Type<Postgres> for OutboundSecret

§

impl Type<Postgres> for Uuid

§

impl Type<Postgres> for Duration

§

impl<DB> Type<DB> for Value
where Json<Value>: Type<DB>, DB: Database,

§

impl<DB> Type<DB> for RawValue
where Json<&'a RawValue>: for<'a> Type<DB>, DB: Database,

§

impl<T> Type<Postgres> for Json<T>

§

impl<T> Type<Postgres> for Text<T>

§

impl<Tz> Type<Postgres> for DateTime<Tz>
where Tz: TimeZone,