Lösung des Problems
Laut Dokumentation diesel::sql_types::Unsigned<T>bietet Diesel keine eingebaute Unterstützung für Unsigned<Decimal>. (Auf dieser Seite sind keine spezifischen ToSql/ FromSql/ AsExpressionimpls aufgeführt, im Gegensatz zu beispielsweise Unsigned<Integer>.) Dasselbe gilt für rust_numeric::Decimal(Auch nur ein FromSql/ ToSqlimpl für Numeric/ Decimalno one for Unsigned<Decimal>.
Das alles bedeutet, dass keine der Kisten eine Unsigned<Decimal>Säule aus der Box trägt. Sie können solche Spalten unterstützen, indem Sie die entsprechenden Eigenschaften selbst implementieren. Das bedeutet die Implementierung von FromSql/ ToSql+ Ableitung AsExpression/ FromSqlRowfür den entsprechenden Wrapper des neuen Typs.
Das würde zu folgendem Code führen:
use diesel::sql_types::{Unsigned, Decimal};
use diesel::serialize::{self, ToSql};
use diesel::deserialize::{self, FromSql};
use diesel::mysql::Mysql;
#[derive(AsExpression, FromSqlRow)]
#[sql_type = "Unsigned<Decimal>"]
struct DecimalWrapper(rust_decimal::Decimal);
impl FromSql<Unsigned<Decimal>, Mysql> for DecimalWrapper {
fn from_sql(bytes: Option<&[u8]>) -> deserialize::Result<Self> {
<rust_decimal::Decimal as FromSql<Decimal, Mysql>>::from_sql(bytes).map(Self)
}
}
impl ToSql<Unsigned<Decimal>, Mysql> for DecimalWrapper {
fn to_sql<W: Write>(&self, out: &mut serialize::Output<'_, W, DB>) -> serialize::Result {
<_ as ToSql<Decimal, Mysql>>::to_sql(&self.0, out)
}
}
Keine Kommentare:
Kommentar veröffentlichen