Rust + mysql, diesel で接続する例 #Rust #mysql

■ 概要:

前のRustの関連となり。
mysql + dieselで、操作するメモとなります

■ 環境

Rust
rustc 1.46.0
cargo 1.46.0
diesel
ubuntu 18.04
mysql / MariaDB 10.4.6


■ 参考サイト様

https://diesel.rs/guides/getting-started/

https://mshr-t.hatenablog.jp/entry/2019/06/11/022151

■ diesel 追加

・ 上記の、getting-started/ postgress版 と同様になりますが。
 mysql に接続する手順で、DBは、事前に作成した場合の例です

■ Cargo.toml

[dependencies]
diesel = { version = "*", features = ["mysql"] }

・ diesel_cli

cargo install diesel_cli

・migration

diesel migration generate create_posts

・下記のような。フォルダに
migrations/2020-10-01-064939_create_posts/

down.sql, up.sql が、作成されます

・up.sql

CREATE TABLE posts (
 id INTEGER AUTO_INCREMENT PRIMARY KEY,
 title VARCHAR(255) NOT NULL,
 body TEXT NOT NULL,
 published BOOLEAN NOT NULL DEFAULT 0
);

・down.sql

DROP TABLE posts;

・diesel migration run
成功すると、
src/schema.rs 等が、生成されます。

table! {
   posts (id) {
       id -> Nullable<Integer>,
       title -> Text,
       body -> Text,
       published -> Bool,
   }
}

■ 接続

use diesel::mysql::MysqlConnection;
use diesel::prelude::*;
use dotenv::dotenv;

//
pub fn establish_connection() -> MysqlConnection {
   // mysql://user:pass@host/dbname
   let database_url = "mysql://db_user:password@127.0.0.1/vue1";

   MysqlConnection::establish(&database_url)
       .expect(&format!("Error connecting to {}", database_url))
}

database_urlは、

mysql://user:pass@host/dbname
のような、DBに合わせて設定

■ INSERT の例です

#[macro_use]
extern crate diesel;
extern crate dotenv;

pub mod schema;

use diesel::prelude::*;
use diesel::deserialize::QueryableByName;
use diesel::mysql::MysqlConnection;
use diesel::sql_query;

mod lib;

#[derive(Queryable)]
pub struct Post {
   pub id: i32,
   pub title: String,
   pub body: String,
   pub published: bool,
}
use schema::posts;

#[derive(Insertable)]
#[table_name="posts"]
pub struct NewPost {
   pub title: String,
   pub body: String,
}
//
fn main() {
   println!("#start-db");
   use self::schema::posts::dsl::{id, posts};

   let connection = lib::establish_connection();

   let new_post = NewPost {
       title: "t1".to_string(),
       body: "b1".to_string(),
   };
   diesel::insert_into(posts)
       .values(&new_post)
       .execute(&connection)
       .expect("Error saving new post");    
}

■ エラー等、
コンパイル時に、library not found for -lmysqlclient
のようなエラーが出た場合、
apt検索して、apt search libmysqlclient
sudo apt-get install libmysqlclient-dev ,で回避できました。

■ 参考の設定

https://github.com/kuc-arc-f/diesel_test


ここから先は

0字

Rust WebAssembly 開発の事例、ノウハウに関する記事を集めました。第2回 ■ 免責事項 / 注記 , 内容について動作確…

この記事が気に入ったらサポートをしてみませんか?