Спасибо за подробное объяснение, а также за совет о том, как просмотреть расширенный код. Все еще собираюсь принять ответ Шепмастера, так как я не хочу явно использовать внутренности 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"

Ответы на вопрос(2)

Ваш ответ на вопрос