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
/ AsExpression
impls aufgeführt, im Gegensatz zu beispielsweise Unsigned<Integer>
.) Dasselbe gilt für rust_numeric::Decimal
(Auch nur ein FromSql
/ ToSql
impl für Numeric
/ Decimal
no 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
/ FromSqlRow
fü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