実現したいこと
rustでSeaOrmを使ってDBからデータをselectしたいのですが、コンパイルエラーを解決できなくなってしまいました。
SeaOrmの公式ドキュメントや、個人技術ブログなどを参考に、DBへの接続情報をSeaOrmのselectするメソッドに渡すように作っているのですが、後述するソースではうまくいかず、後述するコンパイルエラーがでてしまいます。
発生している問題・分からないこと
・エラー内容
(expected DatabaseConnection
と書かれているので、 let db:DatabaseConnection としているのですが解消できません。)
error[E0308]: mismatched types
--> src/main.rs:9:34
|
9 | let db:DatabaseConnection = check_connection();
| ------------------ ^^^^^^^^^^^^^^^^^^ expected DatabaseConnection
, found future
| |
| expected due to this
該当のソースコード
src/main.rs
1mod database; 2use sea_orm::{DatabaseConnection, DbConn, DbErr, EntityTrait}; 3 4use crate::database::db_connection::check_connection; 5use crate::database::entities::*; 6use crate::database::entities::prelude::Employees; 7 8fn main() { 9 let db:DatabaseConnection = check_connection(); 10 select_employees(&db); 11} 12 13pub async fn select_employees(db: &DbConn) -> Result<Option<employees::Model>, DbErr> { 14 let selected: Option<employees::Model> = Employees::find_by_id(1).one(db).await?; 15 Ok(selected) 16}
src/database/db_connection.rs
1※DBコネクションに関する箇所のみ 2use std::env; 3use std::time::Duration; 4use dotenv::dotenv; 5use sea_orm::{ActiveModelTrait, ActiveValue, ConnectOptions, Database, DbConn, DbErr, DeleteResult, EntityTrait, QueryFilter}; 6use sea_orm::ActiveValue::Set; 7use crate::database::entities::{todos, users}; 8use crate::database::entities::prelude::Todos; 9use sea_orm::ColumnTrait; 10 11pub async fn check_connection() -> Result<(), DbErr> { 12 // DB接続のためのコネクションを生成 13 let db = establish_connection().await?; 14 15 assert!(db.ping().await.is_ok()); 16 db.clone().close().await.expect("panic!"); 17 println!("OK"); 18 Ok(()) 19} 20 21pub async fn establish_connection() -> Result<DbConn, DbErr> { 22 dotenv().ok(); 23 24 let url = env::var("DATABASE_URL").expect("DATABASE_URL is not found."); 25 26 let mut opt = ConnectOptions::new(url); 27 opt.max_connections(100) 28 .min_connections(5) 29 .connect_timeout(Duration::from_secs(8)) 30 .acquire_timeout(Duration::from_secs(8)) 31 .idle_timeout(Duration::from_secs(8)) 32 .max_lifetime(Duration::from_secs(8)) 33 .sqlx_logging(true) 34 .sqlx_logging_level(log::LevelFilter::Info); 35 36 // DB接続のためのコネクションを生成 37 Database::connect(opt).await 38}
修正後
src/main.rs
1fn main() { 2start(); 3} 4 5pub async fn select_employees(db: &DbConn) -> Result<Optionemployees::Model, DbErr> { 6let selected: Optionemployees::Model = Employees::find_by_id(1).one(db).await?; 7Ok(selected) 8} 9 10pub async fn start() { 11let db:DatabaseConnection = establish_connection().await.expect("connection error!"); 12let select_res:Optionemployees::Model = select_employees(&db).await.expect("database select error!"); 13println!("{}", select_res.unwrap().id); 14}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
上記のエラーメッセージと同様ですが画像のようにエラーが出ています。
補足
・db_connection.rsを参考にしたサイト
https://zenn.dev/collabostyle/articles/0641d73f776d80
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/07/27 15:02
2024/08/02 09:45