You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何为MariaDB的Point类型字段定义结构体属性?

Rust + MariaDB: 定义coors字段类型及存储方法

1. 确定coors字段的Rust类型

具体类型取决于你MariaDB表中coors字段的实际类型,以下是三种常见场景的对应方案:

场景1:数据库字段为POINT(地理坐标类型)

如果coors是MariaDB的地理POINT类型,直接使用sqlx提供的地理类型:
首先在Cargo.toml添加依赖:

sqlx = { version = "0.7", features = ["mariadb", "geo", "chrono", "json"] }
geo = "0.27"

结构体定义:

use sqlx::types::geo::Point;

#[derive(sqlx::FromRow, Serialize, Deserialize, Debug)]
pub struct Bar {
    pub id: Option<i32>,
    pub name: Option<String>,
    pub description: Option<String>,
    pub address: Option<String>,
    pub create_At: Option<NaiveDateTime>,
    pub update: Option<NaiveDateTime>,
    pub schedule: Option<String>,
    pub capacitance_idcapacitance: Option<i32>,
    pub coors: Option<Point<f64>>,
}

场景2:数据库字段为JSON(存储坐标数组,如[116.397, 39.908])

如果coors是JSON类型,有两种选择:

  • 灵活但无类型校验:用serde_json::Value
    先加依赖:
    serde = { version = "1.0", features = ["derive"] }
    serde_json = "1.0"
    
    结构体定义:
    use serde_json::Value;
    
    #[derive(sqlx::FromRow, Serialize, Deserialize, Debug)]
    pub struct Bar {
        // 其他字段...
        pub coors: Option<Value>,
    }
    
  • 类型安全:自定义坐标结构体
    #[derive(Serialize, Deserialize, Debug, sqlx::Type)]
    #[sqlx(type_name = "JSON")]
    pub struct Coordinates {
        pub lon: f64,
        pub lat: f64,
    }
    
    #[derive(sqlx::FromRow, Serialize, Deserialize, Debug)]
    pub struct Bar {
        // 其他字段...
        pub coors: Option<Coordinates>,
    }
    

场景3:数据库字段为字符串(如"116.397,39.908"格式)

直接用Option<String>:

#[derive(sqlx::FromRow, Serialize, Deserialize, Debug)]
pub struct Bar {
    // 其他字段...
    pub coors: Option<String>,
}

2. 存入数据库的实现

针对POINT类型

直接通过sqlx的query!绑定字段插入:

async fn insert_bar(pool: &sqlx::Pool<sqlx::MariaDb>, bar: &Bar) -> Result<(), sqlx::Error> {
    sqlx::query!(
        r#"
        INSERT INTO bars (name, description, address, create_At, update, schedule, capacitance_idcapacitance, coors)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        "#,
        bar.name,
        bar.description,
        bar.address,
        bar.create_At,
        bar.update,
        bar.schedule,
        bar.capacitance_idcapacitance,
        bar.coors
    )
    .execute(pool)
    .await?;
    Ok(())
}

针对JSON类型

无论用serde_json::Value还是自定义结构体,都可以直接绑定插入:

async fn insert_bar(pool: &sqlx::Pool<sqlx::MariaDb>, bar: &Bar) -> Result<(), sqlx::Error> {
    sqlx::query!(
        r#"
        INSERT INTO bars (name, description, address, create_At, update, schedule, capacitance_idcapacitance, coors)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        "#,
        bar.name,
        bar.description,
        bar.address,
        bar.create_At,
        bar.update,
        bar.schedule,
        bar.capacitance_idcapacitance,
        bar.coors
    )
    .execute(pool)
    .await?;
    Ok(())
}

针对字符串类型

先将坐标拼接为字符串,再插入:

// 示例:构造包含坐标的Bar实例
let coors_str = Some(format!("{}, {}", 116.397, 39.908));
let bar = Bar {
    id: None,
    name: Some("Test Bar".to_string()),
    description: None,
    address: None,
    create_At: None,
    update: None,
    schedule: None,
    capacitance_idcapacitance: None,
    coors: coors_str,
};

// 插入数据库
async fn insert_bar(pool: &sqlx::Pool<sqlx::MariaDb>, bar: &Bar) -> Result<(), sqlx::Error> {
    sqlx::query!(
        r#"
        INSERT INTO bars (name, coors)
        VALUES (?, ?)
        "#,
        bar.name,
        bar.coors
    )
    .execute(pool)
    .await?;
    Ok(())
}

内容的提问来源于stack exchange,提问作者larous25

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:53:18