Recently I have been exploring using Diesel for a
simple Rust web application. I quickly ran into a very confusing trait
bound
error, listed below when integrating with chrono
. It took me a
while to understand and fix the error, which I thought I should write down
for later!
The error only started showing up when I queried a specific model:
error[E0277]: the trait bound `DateTime<Utc>: FromSql<diesel::sql_types::Nullable<diesel::sql_types::Timestamptz>, Pg>` is not satisfied
--> src/main.rs:85:64
|
85 | let choices: Vec<Choice> = Choice::belonging_to(&poll).get_results(&pgconn).expect("Failed to get relations");
| ^^^^^^^^^^^ the trait `FromSql<diesel::sql_types::Nullable<diesel::sql_types::Timestamptz>, Pg>` is not implemented for `DateTime<Utc>`
|
= help: the following implementations were found:
<DateTime<Utc> as FromSql<diesel::sql_types::Timestamptz, Pg>>
= note: required because of the requirements on the impl of `Queryable<diesel::sql_types::Nullable<diesel::sql_types::Timestamptz>, Pg>` for `DateTime<Utc>`
= note: required because of the requirements on the impl of `Queryable<(diesel::sql_types::Integer, diesel::sql_types::Text, diesel::sql_types::Integer, diesel::sql_types::Nullable<diesel::sql_types::Timestamptz>), Pg>` for `(i32, std::string::String, i32, DateTime<Utc>)`
= note: required because of the requirements on the impl of `Queryable<(diesel::sql_types::Integer, diesel::sql_types::Text, diesel::sql_types::Integer, diesel::sql_types::Nullable<diesel::sql_types::Timestamptz>), Pg>` for `models::Choice`
= note: required because of the requirements on the impl of `LoadQuery<PooledConnection<ConnectionManager<PgConnection>>, models::Choice>` for `diesel::query_builder::SelectStatement<schema::choices::table, query_builder::select_clause::DefaultSelectClause, query_builder::distinct_clause::NoDistinctClause, query_builder::where_clause::WhereClause<diesel::expression::operators::Eq<schema::choices::columns::poll_id, diesel::expression::bound::Bound<diesel::sql_types::Integer, &i32>>>>`
error: aborting due to previous error; 1 warning emitted
I stumbled into this closed issue, which didn’t really help me, but it did inspire me to review the src/schema.rs
:
table! {
choices (id) {
id -> Int4,
details -> Text,
poll_id -> Int4,
created_at -> Nullable<Timestamptz>,
}
}
The created_at
column is what is causing issues for me, and I noticed that it’s wrapped in a Nullable
. Meanwhile, my struct looks like:
#[derive(Associations, Debug, Identifiable, Queryable, Serialize)]
#[belongs_to(Poll)]
pub struct Choice {
id: i32,
details: String,
poll_id: i32,
created_at: DateTime<Utc>,
}
Turns out the Nullable
wrapper around the Timestamptz
SQL type was causing behavior that I didn’t want. The underlying problem ended up being that my table definition didn’t include a NOT NULL
despite including a DEFAULT NOW()
.
Naturally, altering the statement to be created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
caused my compilation error to disappear, fun!