admin管理员组文章数量:1402995
I am using SeaORM in a Rust project and trying to retrieve ranked user balances using MySQL’s RANK() OVER (ORDER BY ...)
. However, the rank
field always returns 0
for all rows.
Rust Code:
#[allow(unused_imports)]
use loco_rs::{cli::playground, prelude::*};
use myapp::app::App;
use myapp::models::_entities::wallets::{self, ActiveModel, Entity, Model};
use sea_orm::{DatabaseConnection, DbBackend, Statement, Value};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Debug)]
struct UserRank {
name: String,
rank: i64,
balance: i32,
}
#[tokio::main]
async fn main() -> loco_rs::Result<()> {
let _ctx = playground::<App>().await?;
let db = &_ctx.db;
let coins_query = r#"
SELECT t.first_name, t.last_name, w.coins,
RANK() OVER (ORDER BY w.coins DESC) AS `rank`
FROM wallets w
JOIN game_users g ON w.game_user_id = g.id
JOIN telegram_users t ON g.id = t.game_user_id
ORDER BY w.coins DESC LIMIT 10;
"#;
let coins = db
.query_all(Statement::from_string(DbBackend::MySql, coins_query))
.await
.unwrap()
.into_iter()
.map(|row| UserRank {
name: format!(
"{} {}",
row.try_get::<String>("", "first_name").unwrap_or_default(),
row.try_get::<String>("", "last_name").unwrap_or_default()
),
rank: row.try_get::<i64>("", "rank").unwrap_or(0), // Always returns 0
balance: row.try_get::<i32>("", "coins").unwrap_or(0),
})
.collect::<Vec<_>>();
println!("User Ranks: {:#?}", coins);
Ok(())
}
Output (Unexpected Behavior):
User Ranks: [
UserRank {
name: "Alok Alok",
rank: 0, // Should be 1
balance: 1290,
},
UserRank {
name: "Alok2 Alok2 ",
rank: 0, // Should be 2
balance: 0,
},
]
Things I Have Tried:
- Changing the
rank
field type fromi32
toi64
inUserRank
struct. - Wrapping the alias in backticks:
rank: row.try_get::<i64>("", "`rank`").unwrap_or(0),
- Running the query directly in MySQL (works fine, returns correct ranks).
Why is RANK() OVER (...)
always returning 0
when retrieved using SeaORM, and how can I correctly fetch the computed rank
column in Rust?
I am using SeaORM in a Rust project and trying to retrieve ranked user balances using MySQL’s RANK() OVER (ORDER BY ...)
. However, the rank
field always returns 0
for all rows.
Rust Code:
#[allow(unused_imports)]
use loco_rs::{cli::playground, prelude::*};
use myapp::app::App;
use myapp::models::_entities::wallets::{self, ActiveModel, Entity, Model};
use sea_orm::{DatabaseConnection, DbBackend, Statement, Value};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Debug)]
struct UserRank {
name: String,
rank: i64,
balance: i32,
}
#[tokio::main]
async fn main() -> loco_rs::Result<()> {
let _ctx = playground::<App>().await?;
let db = &_ctx.db;
let coins_query = r#"
SELECT t.first_name, t.last_name, w.coins,
RANK() OVER (ORDER BY w.coins DESC) AS `rank`
FROM wallets w
JOIN game_users g ON w.game_user_id = g.id
JOIN telegram_users t ON g.id = t.game_user_id
ORDER BY w.coins DESC LIMIT 10;
"#;
let coins = db
.query_all(Statement::from_string(DbBackend::MySql, coins_query))
.await
.unwrap()
.into_iter()
.map(|row| UserRank {
name: format!(
"{} {}",
row.try_get::<String>("", "first_name").unwrap_or_default(),
row.try_get::<String>("", "last_name").unwrap_or_default()
),
rank: row.try_get::<i64>("", "rank").unwrap_or(0), // Always returns 0
balance: row.try_get::<i32>("", "coins").unwrap_or(0),
})
.collect::<Vec<_>>();
println!("User Ranks: {:#?}", coins);
Ok(())
}
Output (Unexpected Behavior):
User Ranks: [
UserRank {
name: "Alok Alok",
rank: 0, // Should be 1
balance: 1290,
},
UserRank {
name: "Alok2 Alok2 ",
rank: 0, // Should be 2
balance: 0,
},
]
Things I Have Tried:
- Changing the
rank
field type fromi32
toi64
inUserRank
struct. - Wrapping the alias in backticks:
rank: row.try_get::<i64>("", "`rank`").unwrap_or(0),
- Running the query directly in MySQL (works fine, returns correct ranks).
Why is RANK() OVER (...)
always returning 0
when retrieved using SeaORM, and how can I correctly fetch the computed rank
column in Rust?
1 Answer
Reset to default 0The correct type for RANK() OVER (...)
in MySQL when using SeaORM is u32
or u64
. Changing the rank field to u32
or u64
resolves the issue and retrieves the correct values.
本文标签: rustRANK() Always Returns 0 in SeaORM QueryStack Overflow
版权声明:本文标题:rust - RANK() Always Returns 0 in SeaORM Query - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744359985a2602495.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论