diesel rust orm 框架試用


diesel 是一個不錯的rust orm框架,提供了cli ,可以方便的進行migration 操作,以及幫助代碼生成
以下是一個簡單的試用

安裝cli

注意需要最新的stable 版本,數據庫使用docker-compose 運行

cargo install diesel_cli

項目准備

  • docker-compose 服務
    關於rust 項目構建的,后邊說明
 
version: "3"
services: 
  app:
    build: ./
  pg:
    image: postgres:12.1-alpine
    environment: 
    - "POSTGRES_PASSWORD:dalong"
    ports:
    - "5432:5432"
  • 初始化項目
cargo new --lib diesel_demo
cd diesel_demo
  • 添加diesel 依賴
    Cargo.toml
 
[dependencies]
diesel = { version = "1.0.0", features = ["postgres"] }
dotenv = "0.9.0"
  • 添加數據庫環境變量
    項目使用dotenv管理環境變量,12 factor 模式
 
.env 本地開發模式使用
DATABASE_URL=postgres://postgres:dalong@localhost/diesel_demo
.env-prod: docker 生產使用
DATABASE_URL=postgres://postgres:dalong@pg/diesel_demo
  • 啟動pg 服務
docker-compose up -d pg
  • 創建數據庫
diesel setup
  • 創建一個實體
diesel migration generate create_posts
  • 添加migration 腳本
    up.sql
 
CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  title VARCHAR NOT NULL,
  body TEXT NOT NULL,
  published BOOLEAN NOT NULL DEFAULT 'f'
)

down.sql

DROP TABLE posts
  • schema migration
diesel migration run

代碼使用

  • 創建連接
    src/lib.rs
 
#[macro_use]
extern crate diesel;
extern crate dotenv;
use diesel::prelude::*;
use diesel::pg::PgConnection;
use dotenv::dotenv;
use std::env;
pub mod schema;
pub mod models;
pub fn establish_connection() -> PgConnection {
    dotenv().ok();
    let database_url = env::var("DATABASE_URL")
        .expect("DATABASE_URL must be set");
    PgConnection::establish(&database_url)
        .expect(&format!("Error connecting to {}", database_url))
}
  • model
    src/models.rs
 
#[derive(Queryable)]
pub struct Post {
    pub id: i32,
    pub title: String,
    pub body: String,
    pub published: bool,
}
  • 生成的schema
table! {
    posts (id) {
        id -> Int4,
        title -> Varchar,
        body -> Text,
        published -> Bool,
    }
}
  • 代碼入口
    src/bin/show_posts.rs
 
extern crate diesel_demo;
extern crate diesel;
use self::diesel_demo::*;
use self::models::*;
use self::diesel::prelude::*;
fn main() {
    use diesel_demo::schema::posts::dsl::*;
    let connection = establish_connection();
    let results = posts.filter(published.eq(true))
        .limit(5)
        .load::<Post>(&connection)
        .expect("Error loading posts");
    println!("Displaying {} posts", results.len());
    for post in results {
        println!("{}", post.title);
        println!("----------\n");
        println!("{}", post.body);
    }
}
  • insert demo 數據
INSERT INTO "public"."posts"("id","title","body","published")
VALUES
(1,E'dalong',E'demo',TRUE);
  • 本地運行
cargo run --bin show_posts

 

 

  • docker運行
    dockerfile,使用多階段構建(制作小的鏡像),同時為了提高構建的速度,使用了中科大的cargo鏡像
FROM rustlang/rust:nightly-slim as build
WORKDIR /app
RUN mkdir -p $HOME/.cargo
COPY diesel_demo/ /app
# cargo 加速
COPY diesel_demo/config $HOME/.cargo/
RUN apt-get update && apt-get install -y libpq-dev
RUN rustup --version
RUN rustc --version && \
    rustup --version && \
    cargo --version
RUN cargo build --bin show_posts --release
FROM debian:stretch-slim
WORKDIR /app
RUN apt-get update && apt-get install -y libpq5
COPY diesel_demo/.env-prod /app/.env
COPY --from=build /app/target/release/show_posts /usr/local/bin/show_posts
CMD [ "show_posts" ]

加速配置
config

 
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

說明

從目前來說rust 以及python 還有php 等語言,使用alpine 做為基礎鏡像並不太好(依賴,libc 的不同,還有依賴)
使用debian,ubuntu,還有centos 作為這類語言的基礎鏡像會很不錯,有時表象的小,可能並不是最優的方案

參考資料

http://diesel.rs/guides/getting-started/
https://github.com/rongfengliang/diesel-docker-running
https://www.cnblogs.com/rongfengliang/p/11337157.html
https://lug.ustc.edu.cn/wiki/mirrors/help/rust-crates


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM