Trait diesel::deserialize::FromSql
source · pub trait FromSql<A, DB: Backend>: Sized {
// Required method
fn from_sql(bytes: DB::RawValue<'_>) -> Result<Self>;
// Provided method
fn from_nullable_sql(bytes: Option<DB::RawValue<'_>>) -> Result<Self> { ... }
}
Expand description
Deserialize a single field of a given SQL type.
When possible, implementations of this trait should prefer to use an
existing implementation, rather than reading from bytes
. (For example, if
you are implementing this for an enum which is represented as an integer in
the database, prefer i32::from_sql(bytes)
(or the explicit form
<i32 as FromSql<Integer, DB>>::from_sql(bytes)
) over reading from bytes
directly)
Types which implement this trait should also have #[derive(FromSqlRow)]
§Backend specific details
- For PostgreSQL, the bytes will be sent using the binary protocol, not text.
- For SQLite, the actual type of
DB::RawValue
is private API. All implementations of this trait must be written in terms of an existing primitive. - For MySQL, the value of
bytes
will depend on the return value oftype_metadata
for the given SQL type. SeeMysqlType
for details. - For third party backends, consult that backend’s documentation.
§Examples
Most implementations of this trait will be defined in terms of an existing implementation.
#[repr(i32)]
#[derive(Debug, Clone, Copy, FromSqlRow)]
pub enum MyEnum {
A = 1,
B = 2,
}
impl<DB> FromSql<Integer, DB> for MyEnum
where
DB: Backend,
i32: FromSql<Integer, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> deserialize::Result<Self> {
match i32::from_sql(bytes)? {
1 => Ok(MyEnum::A),
2 => Ok(MyEnum::B),
x => Err(format!("Unrecognized variant {}", x).into()),
}
}
}
Required Methods§
Provided Methods§
sourcefn from_nullable_sql(bytes: Option<DB::RawValue<'_>>) -> Result<Self>
fn from_nullable_sql(bytes: Option<DB::RawValue<'_>>) -> Result<Self>
A specialized variant of from_sql
for handling null values.
The default implementation returns an UnexpectedNullError
for
an encountered null value and calls Self::from_sql
otherwise
If your custom type supports null values you need to provide a custom implementation.
Object Safety§
Implementations on Foreign Types§
source§impl FromSql<BigInt, Sqlite> for i64
impl FromSql<BigInt, Sqlite> for i64
fn from_sql(value: SqliteValue<'_, '_, '_>) -> Result<Self>
source§impl FromSql<Binary, Sqlite> for *const [u8]
impl FromSql<Binary, Sqlite> for *const [u8]
The returned pointer is only valid for the lifetime to the argument of
from_sql
. This impl is intended for uses where you want to write a new
impl in terms of Vec<u8>
, but don’t want to allocate. We have to return a
raw pointer instead of a reference with a lifetime due to the structure of
FromSql
fn from_sql(bytes: SqliteValue<'_, '_, '_>) -> Result<Self>
source§impl FromSql<Bool, Sqlite> for bool
impl FromSql<Bool, Sqlite> for bool
fn from_sql(value: SqliteValue<'_, '_, '_>) -> Result<Self>
source§impl FromSql<Date, Sqlite> for String
impl FromSql<Date, Sqlite> for String
fn from_sql(value: SqliteValue<'_, '_, '_>) -> Result<Self>
source§impl FromSql<Double, Sqlite> for f64
impl FromSql<Double, Sqlite> for f64
fn from_sql(value: SqliteValue<'_, '_, '_>) -> Result<Self>
source§impl FromSql<Float, Sqlite> for f32
impl FromSql<Float, Sqlite> for f32
fn from_sql(value: SqliteValue<'_, '_, '_>) -> Result<Self>
source§impl FromSql<Integer, Sqlite> for i32
impl FromSql<Integer, Sqlite> for i32
fn from_sql(value: SqliteValue<'_, '_, '_>) -> Result<Self>
source§impl FromSql<SmallInt, Sqlite> for i16
impl FromSql<SmallInt, Sqlite> for i16
fn from_sql(value: SqliteValue<'_, '_, '_>) -> Result<Self>
source§impl FromSql<Text, Sqlite> for *const str
impl FromSql<Text, Sqlite> for *const str
The returned pointer is only valid for the lifetime to the argument of
from_sql
. This impl is intended for uses where you want to write a new
impl in terms of String
, but don’t want to allocate. We have to return a
raw pointer instead of a reference with a lifetime due to the structure of
FromSql