Module geozero::postgis::diesel

source ·
Expand description

Postgis geometry type encoding for Diesel. Requires the with-postgis-diesel feature.

§PostGIS usage example with Diesel

Declare model and select Ewkb types directly with GeoZero and Diesel

use diesel::pg::PgConnection;
use diesel::{Connection, QueryDsl, RunQueryDsl};
use diesel::prelude::*;

use geozero::wkb::Ewkb;

diesel::table! {
    use diesel::sql_types::*;
    use geozero::postgis::diesel::sql_types::*;

    geometries (name) {
        name -> Varchar,
        geom -> Nullable<Geometry>,
    }
}

#[derive(Queryable, Debug, Insertable)]
#[diesel(table_name = geometries)]
pub struct Geom {
    pub name: String,
    pub geom: Option<Ewkb<Vec<u8>>>,
}

pub fn establish_connection() -> PgConnection {
    let database_url = std::env::var("DATABASE_URL").expect("Unable to find database url.");
    PgConnection::establish(&database_url).unwrap()
}

let conn = &mut establish_connection();

let wkb = Ewkb(vec![
    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 64, 0, 0, 0, 0, 0, 0, 52, 192,
]);

let insert_geometry = Geom {
    name: "GeoZeroTest".to_string(),
    geom: Some(wkb),
};

let inserted: Geom = diesel::insert_into(geometries::table)
    .values(&insert_geometry)
    .get_result(conn)
    .expect("Unable to insert into postgis");

let geometry_vec: Vec<Geom> = geometries::dsl::geometries
    .limit(10)
    .load::<Geom>(conn)
    .expect("Error loading geometries");

Modules§