#[cfg(all(feature = "diesel1", not(feature = "diesel2")))] impl FromSql<Numeric, Mysql> for Decimal { fn from_sql(numeric: Option<&[u8]>) -> deserialize::Result<Self> { // From what I can ascertain, MySQL simply reads from a string format for the Decimal type. // Explicitly, it looks like it is length followed by the string. Regardless, we can leverage // internal types. let bytes = numeric.ok_or("Invalid decimal")?; let s = std::str::from_utf8(bytes)?;
Decimal::from_str(s).map_err(|e| e.into())
}
}
#[cfg(feature = "diesel2")] impl FromSql<Numeric, Mysql> for Decimal { fn from_sql(numeric: diesel::mysql::MysqlValue) -> deserialize::Result<Self> { // From what I can ascertain, MySQL simply reads from a string format for the Decimal type. // Explicitly, it looks like it is length followed by the string. Regardless, we can leverage // internal types. let s = std::str::from_utf8(numeric.as_bytes())?;
Decimal::from_str(s).map_err(|e| e.into())
}
}
#[cfg(test)] mod tests { usesuper::*; use diesel::deserialize::QueryableByName; use diesel::prelude::*; use diesel::row::NamedRow; use diesel::sql_query; use diesel::sql_types::Text;
/// Gets the URL for connecting to MySQL for testing. Set the MYSQL_URL /// environment variable to change from the default of "mysql://root@localhost/mysql". fn get_mysql_url() -> String { iflet Ok(url) = std::env::var("MYSQL_URL") { return url;
} "mysql://root@127.0.0.1/mysql".to_string()
}
#[cfg(all(feature = "diesel1", not(feature = "diesel2")))] mod diesel1 { usesuper::*;
impl QueryableByName<Mysql> for Test { fn build<R: NamedRow<Mysql>>(row: &R) -> deserialize::Result<Self> { let value = row.get("value")?;
Ok(Test { value })
}
}
impl QueryableByName<Mysql> for NullableTest { fn build<R: NamedRow<Mysql>>(row: &R) -> deserialize::Result<Self> { let value = row.get("value")?;
Ok(NullableTest { value })
}
}
#[test] fn test_null() { let connection = diesel::MysqlConnection::establish(&get_mysql_url()).expect("Establish connection");
// Test NULL let items: Vec<NullableTest> = sql_query("SELECT CAST(NULL AS DECIMAL) AS value")
.load(&connection)
.expect("Unable to query value"); let result = items.first().unwrap().value;
assert_eq!(None, result);
}
#[test] fn read_numeric_type() { let connection = diesel::MysqlConnection::establish(&get_mysql_url()).expect("Establish connection"); for &(precision, scale, sent, expected) in TEST_DECIMALS.iter() { let items: Vec<Test> = sql_query(format!( "SELECT CAST('{}' AS DECIMAL({}, {})) AS value",
sent, precision, scale
))
.load(&connection)
.expect("Unable to query value");
assert_eq!(
expected,
items.first().unwrap().value.to_string(), "DECIMAL({}, {}) sent: {}",
precision,
scale,
sent
);
}
}
#[test] fn write_numeric_type() { let connection = diesel::MysqlConnection::establish(&get_mysql_url()).expect("Establish connection"); for &(precision, scale, sent, expected) in TEST_DECIMALS.iter() { let items: Vec<Test> =
sql_query(format!("SELECT CAST(? AS DECIMAL({}, {})) AS value", precision, scale))
.bind::<Text, _>(sent)
.load(&connection)
.expect("Unable to query value");
assert_eq!(
expected,
items.first().unwrap().value.to_string(), "DECIMAL({}, {}) sent: {}",
precision,
scale,
sent
);
}
}
}
#[cfg(feature = "diesel2")] mod diesel2 { usesuper::*;
impl QueryableByName<Mysql> for Test { fn build<'a>(row: &impl NamedRow<'a, Mysql>) -> deserialize::Result<Self> { let value = NamedRow::get(row, "value")?;
Ok(Test { value })
}
}
impl QueryableByName<Mysql> for NullableTest { fn build<'a>(row: &impl NamedRow<'a, Mysql>) -> deserialize::Result<Self> { let value = NamedRow::get(row, "value")?;
Ok(NullableTest { value })
}
}
// Test NULL let items: Vec<NullableTest> = sql_query("SELECT CAST(NULL AS DECIMAL) AS value")
.load(&mut connection)
.expect("Unable to query value"); let result = items.first().unwrap().value;
assert_eq!(None, result);
}
#[test] fn read_numeric_type() { letmut connection = diesel::MysqlConnection::establish(&get_mysql_url()).expect("Establish connection"); for &(precision, scale, sent, expected) in TEST_DECIMALS.iter() { let items: Vec<Test> = sql_query(format!( "SELECT CAST('{}' AS DECIMAL({}, {})) AS value",
sent, precision, scale
))
.load(&mut connection)
.expect("Unable to query value");
assert_eq!(
expected,
items.first().unwrap().value.to_string(), "DECIMAL({}, {}) sent: {}",
precision,
scale,
sent
);
}
}
#[test] fn write_numeric_type() { letmut connection = diesel::MysqlConnection::establish(&get_mysql_url()).expect("Establish connection"); for &(precision, scale, sent, expected) in TEST_DECIMALS.iter() { let items: Vec<Test> =
sql_query(format!("SELECT CAST(? AS DECIMAL({}, {})) AS value", precision, scale))
.bind::<Text, _>(sent)
.load(&mut connection)
.expect("Unable to query value");
assert_eq!(
expected,
items.first().unwrap().value.to_string(), "DECIMAL({}, {}) sent: {}",
precision,
scale,
sent
);
}
}
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.