Спасибо за подробное объяснение, а также за совет о том, как просмотреть расширенный код. Все еще собираюсь принять ответ Шепмастера, так как я не хочу явно использовать внутренности Diesel, которые выглядят достаточно страшно.
я есть таблица SQL, с которой я хочу работать через Diesel:
CREATE TABLE records (
id BIGSERIAL PRIMARY KEY,
record_type SMALLINT NOT NULL,
value DECIMAL(10, 10) NOT NULL
)
Эта таблица генерирует следующую схему:
table! {
records (id) {
id -> Int8,
record_type -> Int2,
value -> Numeric,
}
}
Дизель экспортирует десятичные дроби какbigdecimal::BigDecimal
, но я бы хотел работать сdecimal::d128
вместо. Я тоже хочу на картуrecord_type
перечислению, поэтому я объявляю свою модель следующим образом:
use decimal::d128;
pub enum RecordType {
A,
B,
}
pub struct Record {
pub id: i64,
pub record_type: RecordType,
pub value: d128,
}
Я не могу использовать#derive(Queryable, Insertable)
из-за нестандартного отображения типов, поэтому я пытаюсь реализовать эти черты самостоятельно:
impl Queryable<records::SqlType, Pg> for Record {
type Row = (i64, i16, BigDecimal);
fn build(row: Self::Row) -> Self {
Record {
id: row.0,
record_type: match row.1 {
1 => RecordType::A,
2 => RecordType::B,
_ => panic!("Wrong record type"),
},
value: d128!(format!("{}", row.2)),
}
}
}
Я не могу понять, как реализоватьInsertable
, Что этоValues
связанный тип? Документация Дизеля не очень ясно об этом.
Может быть, есть лучший способ добиться того, что я пытаюсь сделать?
Cargo.toml
:
[dependencies]
bigdecimal = "0.0.10"
decimal = "2.0.4"
diesel = { version = "1.1.1", features = ["postgres", "bigdecimal", "num-bigint", "num-integer", "num-traits"] }
dotenv = "0.9.0"