gpt4 book ai didi

rust SQLx: "expected enum ` std::option::Option`"在查询中但不在类似查询中

转载 作者:行者123 更新时间:2023-12-03 08:09:51 28 4
gpt4 key购买 nike

我有两个 Rust 方法,根据两个不同的参数,使用 sqlx 从同一个 SQLite 表中选择数据。

由于 预期的 `i64`,发现枚举 `std::option::Option` 错误,我无法让两者同时工作。

代码

// src/main.rs
use tokio;

use anyhow::Result;
use sqlx::sqlite::SqlitePool;

// The model `StorageName` that I'm retrieving is something like
pub struct StorageName {
pub _id: i64,
pub name: String,
pub url: String,
}

// This compiles only if `_id` is `Option<i64>`
async fn queryByName(pool: &SqlitePool, name: String) -> Result<Vec<StorageName>> {
let results = sqlx::query_as!(
StorageName,
"SELECT * FROM names
WHERE name = ?;",
name,
)
.fetch_all(pool)
.await?;
Ok(results)
}

// This compiles if `_id` is `i64`
// Also querying by `_id` is ok
async fn queryByURL(pool: &SqlitePool, url: String) -> Result<Vec<StorageName>> {
let results = sqlx::query_as!(
StorageName,
"SELECT * FROM names
WHERE url = ?;",
url,
)
.fetch_all(pool)
.await?;
Ok(results)
}

#[tokio::main]
async fn main() -> Result<()> {
Ok(())
}

sqllite .schema 名称 返回

CREATE TABLE names (
_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
url TEXT NOT NULL,
UNIQUE(name, url)
);

Cargo.toml 依赖项:

[dependencies]    
anyhow = "1.0.44"
sqlx = { version = "0.5", features = [ "runtime-tokio-rustls", "sqlite" ] }
tokio = { version = "1.12.0", features = ["full"] }

我该如何解决这个问题? _id 不能同时是 Option 和 i64。

[更新]我怀疑表名称中的复数形式与字段发生冲突。

Rust 版本是 1.56.0

最佳答案

添加AS "<field name><symbol>"到导致此错误的行。
<symbol>是:? - 如果该字段是可选的并且 !如果没有。

在您的情况下,这应该可以解决问题:

SELECT 
_id AS "_id!",
name AS "name!",
url AS "url!"
FROM names
WHERE name = ?;

有关类型覆盖的文档:

https://docs.rs/sqlx/0.5.13/sqlx/macro.query.html#type-overrides-output-columns

备忘单:

enter image description here

(是的,我迟到了,但如果其他人有同样的问题,我会将其留在这里)

关于rust SQLx: "expected enum ` std::option::Option`"在查询中但不在类似查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71158244/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com