質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

260閲覧

モジュール利用の際のエラーが解決できません。

donut4

総合スコア170

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2024/07/21 13:53

編集2024/07/24 13:38

実現したいこと

自作アプリを作っていますがコンパイルエラーで詰まっています。
後述する、db_connection.rs内でentitiesフォルダ内のtodos.rsやusers.rsを利用したいです。

発生している問題・分からないこと

コンパイルエラーが解決できません。
モジュール利用の際のmodやuseキーワードの使い方誤りがあるように感じます。

エラーメッセージ

error

1error[E0583]: file not found for module `entities` 2 --> src/database/db_connection.rs:1:1 3 | 41 | mod entities; 5 | ^^^^^^^^^^^^^ 6 | 7 = help: to create the module `entities`, create file "src/database/db_connection/entities.rs" or "src/database/db_connection/entities/mod.rs" 8 = note: if there is a `mod entities` elsewhere in the crate already, import it with `use crate::...` instead

該当のソースコード

src/database/db_connection.rs

1mod entities; 2 3use std::env; 4use std::time::Duration; 5use dotenv::dotenv; 6use sea_orm::{ActiveModelTrait, ActiveValue, ConnectOptions, Database, DbConn, DbErr, DeleteResult, EntityTrait, QueryFilter}; 7use sea_orm::ActiveValue::Set; 8use crate::entities::{todos, users}; 9use crate::entities::prelude::Todos; 10use sea_orm::ColumnTrait; 11 12//念のため全ソース載せておきます 13 14pub async fn check_connection() -> Result<(), DbErr> { 15 // DB接続のためのコネクションを生成 16 let db = establish_connection().await?; 17 18 assert!(db.ping().await.is_ok()); 19 db.clone().close().await.expect("panic!"); 20 println!("OK"); 21 Ok(()) 22} 23 24pub async fn insert_user(db: &DbConn) -> Result<users::Model, DbErr> { 25 // ユーザーアクティブモデルを生成 26 let user = users::ActiveModel { 27 id: ActiveValue::NotSet, 28 name: Set("John Smith".to_string()) 29 }; 30 31 // insert 32 let user: users::Model = user.insert(db).await?; 33 34 Ok(user) 35} 36 37pub async fn insert_todos(db: &DbConn, user: &users::Model) -> Result<todos::Model, DbErr> { 38 let todo = todos::ActiveModel { 39 id: ActiveValue::NotSet, 40 title: Set("Test".to_string()), 41 description: Set("".to_string()), 42 done: Default::default(), 43 created_by: Set(user.id), 44 updated_by: Set(user.id), 45 }; 46 let todo: todos::Model = todo.insert(db).await?; 47 48 let todo2 = todos::ActiveModel { 49 id: ActiveValue::NotSet, 50 title: Set("Test2".to_string()), 51 description: Set("This todo is a dummy.".to_string()), 52 done: Default::default(), 53 created_by: Set(user.id), 54 updated_by: Set(user.id), 55 }; 56 let _ = todo2.insert(db).await?; 57 58 let todo3 = todos::ActiveModel { 59 id: ActiveValue::NotSet, 60 title: Set("Test3".to_string()), 61 description: Set("test data.".to_string()), 62 done: Set(true), 63 created_by: Set(user.id), 64 updated_by: Set(user.id), 65 }; 66 let _ = todo3.insert(db).await?; 67 68 Ok(todo) 69} 70 71pub async fn select_todo(db: &DbConn, todo: todos::Model) -> Result<Option<todos::Model>, DbErr> { 72 // ID 指定の検索 73 let selected: Option<todos::Model> = Todos::find_by_id(todo.id).one(db).await?; 74 Ok(selected) 75} 76 77pub async fn select_todos_by_user(db: &DbConn, user: &users::Model) -> Result<Vec<todos::Model>, DbErr> { 78 let selected: Vec<todos::Model> = Todos::find().filter(todos::Column::CreatedBy.eq(user.id)).all(db).await?; 79 Ok(selected) 80} 81 82pub async fn update_todo(db: &DbConn, todo: todos::Model) -> Result<todos::Model, DbErr> { 83 // アクティブモデルを into で生成 84 let mut target: todos::ActiveModel = todo.into(); 85 86 // 値を書き換える 87 target.done = Set(true); 88 89 // update 90 let todo: todos::Model = target.update(db).await?; 91 Ok(todo) 92} 93 94pub async fn delete_todo(db: &DbConn, todo: todos::Model) -> Result<(), DbErr> { 95 // アクティブモデルを into で生成 96 let target: todos::ActiveModel = todo.into(); 97 98 // delete 99 let _: DeleteResult = target.delete(db).await?; 100 Ok(()) 101} 102 103pub async fn establish_connection() -> Result<DbConn, DbErr> { 104 dotenv().ok(); 105 106 let url = env::var("DATABASE_URL").expect("DATABASE_URL is not found."); 107 108 let mut opt = ConnectOptions::new(url); 109 opt.max_connections(100) 110 .min_connections(5) 111 .connect_timeout(Duration::from_secs(8)) 112 .acquire_timeout(Duration::from_secs(8)) 113 .idle_timeout(Duration::from_secs(8)) 114 .max_lifetime(Duration::from_secs(8)) 115 .sqlx_logging(true) 116 .sqlx_logging_level(log::LevelFilter::Info); 117 118 // DB接続のためのコネクションを生成 119 Database::connect(opt).await 120} 121 122#[cfg(test)] 123mod tests { 124 use super::*; 125 126 #[tokio::test] 127 async fn connection_works() { 128 let result = check_connection().await; 129 assert_eq!(result, Ok(())); 130 } 131 132 #[tokio::test] 133 async fn it_works() { 134 env_logger::builder() 135 .filter_level(log::LevelFilter::Debug) 136 .is_test(true) 137 .init(); 138 139 let db = establish_connection().await.expect("connection error!"); 140 141 match insert_user(&db).await { 142 Ok(user) => { 143 println!("{:?}", user); 144 145 match insert_todos(&db, &user).await { 146 Ok(todo) => { 147 println!("{:?}", todo); 148 149 // 150 let result = select_todos_by_user(&db, &user).await; 151 println!("{:?}", result); 152 153 match select_todo(&db, todo).await { 154 Ok(result) => { 155 match result { 156 None => {} 157 Some(todo) => { 158 println!("{:?}", todo); 159 160 match update_todo(&db, todo).await { 161 Ok(todo) => { 162 println!("{:?}", todo); 163 164 let result = delete_todo(&db, todo).await; 165 assert!(result.is_ok()); 166 } 167 Err(_) => {} 168 } 169 } 170 } 171 } 172 Err(_) => {} 173 } 174 } 175 Err(_) => {} 176 } 177 } 178 Err(_) => {} 179 } 180 } 181}

src/database/entities.rs

1pub mod todos; 2pub mod users;
特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://zenn.dev/mebiusbox/books/22d4c1ed9b0003/viewer/c12c17
上記のRust2018方式を参考にして同じようにフォルダ階層やmodキーワードなどのファイル記述を合わせてみましたが想定通りに動きませんでした。

補足

フォルダ構成

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

src/database/db_connection.rsmod entities; を書いたら、src/database/db_connection/entities.rs を探しに行きます。(エラーメッセージに書かれているとおりです)
なので、この行は不要です。

src/database/entities.rs をモジュールとして使いたいなら、src/database.rspub mod entities; を書きます。
(質問に記載されていないのでわかりませんが、すでに書かれているんじゃないでしょうか)

src/database/db_connection.rs で書かないといけないのは use ... の部分です。

rust

1use crate::database::entities::{todos, users}; 2 3// もしくは 4use super::entities::{todos, users};

そこで、モジュールを定義・実装しようとしている(mod ...)のか、使おうとしている(use ...)のかという点で考えるとわかりやすいと思います。

投稿2024/07/22 00:06

bsdfan

総合スコア4749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

donut4

2024/07/22 06:10

返信ありがとうございます。 src/database.rsの中身は「pub mod db_connection;」の一行を記載していました。 エラー解消されました。 さらに質問してしまい恐縮ですが、 上記フォルダ階層のままsrc/main.rs内でsrc/database/db_connection.rsのcheck_connection()を使用しようと、 src/main.rsを下のようにしたのですが、下記のようなエラーがでているのですが解消方法をお教えいただけないでしょうか? ・src/main.rsの内容 mod database; use crate::database::db_connection::check_connection; fn main() { check_connection(); } ・エラーの内容 error[E0432]: unresolved import `crate::database::db_connection` --> src/main.rs:2:22 | 2 | use crate::database::db_connection::check_connection; | ^^^^^^^^^^^^^ could not find `db_connection` in `database` ※databaseにdb_connectionを見つけられませんとのことですが、databaseフォルダにdb_connection.rsがあります
bsdfan

2024/07/22 06:17

database.rs で pub mod db_connection; を書いていますでしょうか? 「pub」が必要です。
bsdfan

2024/07/22 06:52

「pub」がない場合は違うエラーメッセージになるので、mod の行そのものが抜けていないでしょうか?
donut4

2024/07/22 07:28 編集

エラー解消されました。ありがとうございます。 ちなみにですけど 最初に「src/database/db_connection.rs に mod entities; を書いたら、src/database/db_connection/entities.rs を探しに行きます。」と教えていただいたので、上記のようにsrc/main.rsにmod database;を記載したら、src/main/database.rsを読みいくのでエラーになると思っていたのですが、このmodキーワードにはそれぞれ異なった仕様があるのでしょうか? 今のところ自分のmodキーワードの仕様の認識は、modキーワードが記載されている.rsファイル名と同名のフォルダ内を参照して、modで指定されいている同名の.rsファイルを見に行く。認識なんですがあっていますでしょうか?
bsdfan

2024/07/22 07:32

main.rslib.rs は特別扱いです。(ルートを表すようなイメージでいいかと思います) なので、それ以外は > 今のところ自分のmodキーワードの仕様の認識は、modキーワードが記載されている.rsファイル名と同名のフォルダ内を参照して、modで指定されいている同名の.rsファイルを見に行く。 と思っていて正しいかと。
donut4

2024/07/22 11:22

ありがとうございます。大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問