Trait sqlx_core::types::Type

source ·
pub trait Type<DB: Database> {
    // Required method
    fn type_info() -> DB::TypeInfo;

    // Provided method
    fn compatible(ty: &DB::TypeInfo) -> bool { ... }
}
Expand description

Indicates that a SQL type is supported for a database.

Compile-time verification

With compile-time verification, the use of type overrides is currently required to make use of any user-defined types.

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 or wrappers around SQL types. The generated implementations directly delegate to the implementation of the inner type.

#[derive(sqlx::Type)]
#[sqlx(transparent)]
struct UserId(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

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§

source

fn type_info() -> DB::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§

source

fn compatible(ty: &DB::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.

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl Type<MySql> for Cow<'_, str>

source§

impl Type<MySql> for bool

source§

impl Type<MySql> for f32

source§

impl Type<MySql> for f64

source§

impl Type<MySql> for i8

source§

impl Type<MySql> for i16

source§

impl Type<MySql> for i32

source§

impl Type<MySql> for i64

source§

impl Type<MySql> for str

source§

impl Type<MySql> for u8

source§

impl Type<MySql> for u16

source§

impl Type<MySql> for u32

source§

impl Type<MySql> for u64

source§

impl Type<MySql> for BigDecimal

source§

impl Type<MySql> for String

source§

impl Type<MySql> for Vec<u8>

source§

impl Type<MySql> for [u8]

source§

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

source§

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

Implementors§