Rust 입문 초보자가 YouTube 생방송으로 웹 개발 3시간째

YouTube의 생방송에서 Rust를 공부 중입니다만, 거기서 Rust를 공부하고 알았던 것을 써 갑니다.

방송 아카이브↓

【생방송 아카이브】 Rust 로 Web 개발에 입문했습니다 ② 고생하면서 데이터베이스에 액세스… 힘들었습니다…
htps: //같다. 베 / z0 256도 Y

이전 기사



Rust 입문 초보자가 YouTube 생방송으로 웹 개발 입문 1시간째, 2시간째
htps : // 코 m / 야스 - 츠 츠 베 / ms / bd0 아 95f7c537b19d3 a8

Rust의 데이터베이스 액세스



공식 페이지에는 다음 중 하나를 선택하면 좋다고 적혀있다.



MySQL을 사용하고 싶기 때문에 Diesel이라는 것을 선택

Diesel 사용법



공식 페이지에서 Getting Started.

Cargo.toml 편집

Cargo.toml
[dependencies]
diesel = { version = "1.4.4", features = ["mysql"] }
dotenv = "0.15.0"

diesel cli 설치



migration 등에 필요
cargo install diesel_cli

.env 준비


echo DATABASE_URL=mysql://username:password@localhost/diesel_demo > .env

Database 설정


diesel setup

Migration 파일 만들기


diesel migration generate create_posts
migrations/ 폴더에 파일이 작성됩니다.

up.sql
CREATE TABLE posts (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  body TEXT NOT NULL,
  published BOOLEAN NOT NULL
)

down.sql
DROP TABLE posts;

Migration 실행


diesel migration run

또한, migration 명령은
diesel migration revert # rollback
diesel migration redo # ロールバックしつつ再度migrate

등이있는 것 같습니다.

Rocket에 설정 추가



Rocket.toml
[global.databases.my_db]
url = "mysql://root:@localhost/diesel_demo"

src/lib.rs
#[macro_use]
extern crate diesel;
extern crate dotenv;

use diesel::prelude::*;
use dotenv::dotenv;
use std::env;

pub mod schema;
pub mod models;

src/models.rs
#[derive(Queryable)]
pub struct Post {
    pub id: i32,
    pub title: String,
    pub body: String,
    pub published: bool,
}

GET에서 Post를 얻는 과정을 작성해보십시오.



src/main.rs
#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;
#[macro_use] extern crate rocket_contrib;


use rocket::http::RawStr;
use rocket::Request;
use serde::Serialize;
use rocket_contrib::json::Json;
use rocket_contrib::databases::diesel;
use self::hello_rocket::models::Post;
use diesel::prelude::*;


#[database("my_db")]
struct MyDbConn(diesel::MysqlConnection);

#[get("/posts/<_id>")]
fn get_post(conn: MyDbConn, _id: i32) -> String {
    use hello_rocket::schema::posts::dsl::*;

    let result = posts.find(_id)
        .first::<Post>(&*conn);
    match result {
        Ok(v) => format!("Post {}", v.title),
        Err(e) => format!("{}", e)
    }
}

fn main() {
    rocket::ignite().mount("/", routes![get_post])
                    .attach(MyDbConn::fairing())
                    .launch();
}

데이터베이스에서 posts 테이블에 데이터 만들기(id = 1)

이제 cargo run를 수행하고 http://localhost:8000/posts/1에 액세스하면 Post <title>가 표시됩니다.

단지 이것만을 위해 이번 생방송은 굉장히 힘들었다…
실제 고통스럽게 하고 싶은 모습을 보고 싶은 분은 동영상을 봐 주세요

좋은 웹페이지 즐겨찾기