#postgis #diesel #gis

postgis_diesel

Diesel框架扩展,支持PostGIS几何数据类型

15个版本 (稳定)

2.4.1 2024年7月21日
2.3.1 2024年4月6日
2.3.0 2024年1月7日
2.2.1 2023年7月16日
0.1.0 2021年2月21日

#69数据库接口

Download history 2323/week @ 2024-04-30 4126/week @ 2024-05-07 3618/week @ 2024-05-14 3459/week @ 2024-05-21 3461/week @ 2024-05-28 2694/week @ 2024-06-04 3431/week @ 2024-06-11 2997/week @ 2024-06-18 3685/week @ 2024-06-25 3869/week @ 2024-07-02 4343/week @ 2024-07-09 3992/week @ 2024-07-16 4005/week @ 2024-07-23 3108/week @ 2024-07-30 2790/week @ 2024-08-06 1683/week @ 2024-08-13

12,269 每月下载量

MIT 协议

120KB
3K SLoC

PostGIS Diesel

Diesel框架扩展,支持PostGIS类型。

使用示例

为确保Geometry类型在作用域内,阅读本指南,并将postgis_diesel::sql_types::*添加到您的diesel.toml文件中的import_types键。

假设表定义如下

CREATE EXTENSION IF NOT EXISTS postgis;
CREATE TABLE geometry_samples
(
    id         SERIAL                    PRIMARY KEY,
    point      geometry(Point,4326)      NOT NULL,
    linestring geometry(Linestring,4326) NOT NULL
);

然后Rust代码可能如下所示

#[macro_use]
extern crate diesel;

use postgis_diesel::operators::*;
use postgis_diesel::types::*;

#[derive(Insertable)]
#[diesel(table_name = geometry_samples)]
struct NewGeometrySample {
    point: Point,
    linestring: LineString<Point>,
}

#[derive(Queryable)]
struct GeometrySample {
    id: i32,
    point: Point,
    linestring: LineString<Point>,
}

table! {
    use postgis_diesel::sql_types::*;
    use diesel::sql_types::*;
    geometry_samples (id) {
        id -> Int4,
        point -> Geometry,
        linestring -> Geometry,
    }
}

有关更完整的示例,请参阅集成测试

如何从模式中删除自动生成的类型

  1. 使用diesel生成模式文件print-schema > src/full_schema.rs
  2. 从其中删除不需要的SQL类型并将其保存到src/schema.rs
  3. 运行diff -U6 src/full_schema.rs src/schema.rs > src/schema.patch
  4. patch_file = "src/schema.patch"添加到diesel.toml。
  5. 删除src/full_schema.rs,检查diesel print-schema > src/schema.rs不会添加Geometry类型。

补丁文件的示例

@@ -1,12 +1,9 @@
 // @generated automatically by Diesel CLI.
 
 pub mod sql_types {
-    #[derive(diesel::query_builder::QueryId, diesel::sql_types::SqlType)]
-    #[diesel(postgres_type(name = "geometry"))]
-    pub struct Geometry;
 
     #[derive(diesel::query_builder::QueryId, diesel::sql_types::SqlType)]
     #[diesel(postgres_type(name = "intensity"))]
     pub struct Intensity;
 
     #[derive(diesel::query_builder::QueryId, diesel::sql_types::SqlType)]
@@ -52,13 +49,12 @@
 
 diesel::table! {
     use diesel::sql_types::*;
     use postgis_diesel::sql_types::*;
     use super::sql_types::Intensity;
     use super::sql_types::Triggermethod;
-    use super::sql_types::Geometry;
 
     laps (activity_id, started_at, manual_track) {
         activity_id -> Uuid,
         started_at -> Timestamptz,
         total_time_seconds -> Float8,
         distance_meters -> Float8,

如何运行测试

  1. 启动Postgis数据库
docker compose up
  1. 运行测试
cargo test

依赖项

~3.5MB
~71K SLoC