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
相关产品推荐
相关产品推荐

