es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo consultar un campo JSON con Diesel?

Tengo estos modelos:

use diesel::sql_types::Json;

#[derive(Queryable)]
pub struct GMapsLocation {
    pub id: i32,
    pub place_id: String,
    pub data: Json,
}

y estoy intentando realizar una consulta en esa columna de esta manera:

let results = gmaps_locations
    .select((id, place_id, data))
    .load::<gmapslocation>(&connection)
    .expect("Error cargando las ubicaciones");

Y eso no está funcionando, me da el error:

18   |         .load::<gmapslocation>(&connection)
     |          ^^^^ el trait `Queryable<diesel::sql_types::json, _="">` no está implementado para `diesel::sql_types::Json`

La documentación no proporciona ejemplos y este error no me dice nada.</diesel::sql_types::json,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema aquí es que el tipo diesel::sql_types::Json no implementa automáticamente el rasgo Queryable.

    Para solucionar esto, deberás implementar manualmente el rasgo Queryable para el tipo Json. Puedes hacer esto agregando el siguiente código a tu archivo:

    use diesel::deserialize::{self, FromSql};
    use diesel::pg::Pg;
    use diesel::serialize::{self, ToSql, Output};
    use std::io::Write;
    
    impl FromSql<json, pg=""> for serde_json::Value {
        fn from_sql(bytes: Option<&[u8]>) -> deserialize::Result<self> {
            let bytes = not_none!(bytes);
            Ok(serde_json::from_slice(bytes)?)
        }
    }
    
    impl ToSql<json, pg=""> for serde_json::Value {
        fn to_sql<w: write="">(&self, out: &mut Output<w, pg="">) -> serialize::Result {
            let string = serde_json::to_string(self)?;
            ToSql::<diesel::sql_types::text, pg="">::to_sql(&string, out)
        }
    }
    

    Este código implementa las conversiones necesarias entre el tipo Json y serde_json::Value, lo que permite consultar la columna Json.

    Una vez que este código se haya agregado, tu consulta original debería funcionar como se esperaba.</diesel::sql_types::text,></w,></json,></json,>

Comments are closed.