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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

解決済

RustでDieselにtransaction-rsを試みるがdiesel::MysqlConnectionにdiesel::connection::Connectionが実装されていないと怒られる

akira_kano1101
akira_kano1101

総合スコア15

MySQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

1回答

0評価

0クリップ

578閲覧

投稿2021/12/29 15:51

編集2021/12/30 04:01

開発環境

  • Macbook Pro M1 2020
  • rustup 1.24.3 (ce5817a94 2021-05-31)
  • mysql Ver 8.0.27 for macos12.0 on arm64 (Homebrew)

解決したいこと

今、RustでDieselを用いてMySQLにデータをCRUDする簡単なアプリケーションを作成しています。ここでプログラムにトランザクションを導入し、データベースを安全に利用したいと考えました。

トランザクション処理のクレートとしてtransaction-rsを選定しました。簡単なexampleも入っていたので手元の環境にコピーし、実行してみました。しかし、動きません。exampleはPostgresを使っていたので、自分のの環境用にデータベースの部分をMySQLへと書き換えました。

そしてわかる範囲でエラーをつぶしたのですが、まだ現状次のようなコンパイルエラーが残っています。

エラーメッセージ(抜粋)
error[E0277]: the trait bound `diesel::MysqlConnection: diesel::connection::Connection` is not satisfied --> src/main.rs:34:5 | 34 | transaction_diesel::run(&conn, tx).unwrap() | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `diesel::connection::Connection` is not implemented for `diesel::MysqlConnection` | note: required by a bound in `transaction_diesel::run` --> /path/to/user/.cargo/registry/src/github.com-1ecc6299db9ec823/transaction-diesel-0.2.2/src/lib.rs:11:9 | 11 | Cn: diesel::Connection, | ^^^^^^^^^^^^^^^^^^ required by this bound in `transaction_diesel::run` error[E0277]: the trait bound `diesel::result::Error: From<diesel::result::Error>` is not satisfied --> src/main.rs:34:36 | 34 | transaction_diesel::run(&conn, tx).unwrap() | ^^ | | | expected an implementor of trait `From<diesel::result::Error>` | help: consider borrowing here: `&tx` | note: required by a bound in `transaction_diesel::run` --> /path/to/user/.cargo/registry/src/github.com-1ecc6299db9ec823/transaction-diesel-0.2.2/src/lib.rs:12:8 | 12 | E: From<diesel::result::Error>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `transaction_diesel::run`
関係しそうなDieselのコード

DieselのGitHubのソースコードを確認するとMysqlConnectionはdiesel::Connectionを実装しているのに、mysql::connectionがプライベートになっていることに気づきました。

これのせいで該当のエラーが起きているように感じるが、ここを修正するのは正規の方法ではなさそうに感じています。

行き詰まってしまいました。

もし、このエラーの解決方法がわかる方がいらっしゃればご教示いただきたいです。

記述したコード

rust

// main.rs #[macro_use] extern crate diesel; extern crate dotenv; extern crate transaction; extern crate transaction_diesel; mod db; mod model; mod schema; use diesel::mysql::MysqlConnection; use diesel::result::Error; use transaction::prelude::*; pub fn establish_connection() -> MysqlConnection { use diesel::prelude::*; use dotenv::dotenv; use std::env; dotenv().ok(); let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); MysqlConnection::establish(&database_url) .expect(&format!("Error connecting to {}", database_url)) } fn main() { let conn = establish_connection(); let tx = with_ctx(|ctx| -> Result<(), Error> { let size = db::create_user("keen").run(ctx)?; println!("created user count: {:?}", size); Ok(()) }); transaction_diesel::run(&conn, tx).unwrap() }

rust

// db.rs use diesel::mysql::MysqlConnection; use diesel::prelude::*; use diesel::result::Error; use transaction::prelude::*; use transaction_diesel::with_conn; use transaction_diesel::DieselContext; use crate::model::*; use crate::schema::users::dsl; type Ctx<'a> = DieselContext<'a, MysqlConnection>; type BoxTx<'a, T> = Box<dyn Transaction<Ctx = Ctx<'a>, Item = T, Err = Error> + 'a>; pub fn create_user<'a>(name: &'a str) -> BoxTx<'a, usize> { with_conn(move |cn| { let size = diesel::insert_into(dsl::users) .values(&NewUser { name: name.to_string(), }) .execute(cn); assert_eq!(Ok(1), size); size }) .boxed() }

rust

// model.rs use crate::schema::*; #[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Default, Hash, Queryable)] pub struct User { pub id: i32, pub name: String, } #[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Default, Hash, Insertable)] #[table_name = "users"] pub struct NewUser { pub name: String, }

toml

# Cargo.toml [package] name = "keen_transaction_mini_try" version = "0.1.0" edition = "2021" [dependencies] dotenv = "0.15.0" transaction = "0.2.1" transaction-diesel = "0.2.2" [dependencies.diesel] features = ["mysql"] version = "1.4.8"

ご覧くださりありがとうございます。ご回答のほど何卒よろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

MySQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。