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:[email protected]/diesel_demo
.env-prod: docker 生产使用
DATABASE_URL=postgres://postgres:[email protected]/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

原文地址:https://www.cnblogs.com/rongfengliang/p/12256614.html

时间: 2024-10-11 04:44:30

diesel rust orm 框架试用的相关文章

atitit.orm的缺点与orm框架市场占有率,选型attilax总结

1. attilax的orm框架要求 1 2. orm框架市场占有率 2 3. spring jdbc templt 3 4. eclipselink /toplink  不好用 4 5. jooq 的总结 4 6. attilax的选择 atiorm 4 7. 参考 4 1. attilax的orm框架要求 1.无需配置文件或注解..直接从map.json生成sql 2.直接获取sql..无需连接数据库..方便调试.或这sql传输. 作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:

最好的5个Android ORM框架

在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式,即本地数据存储,如嵌入式SQLLite,你可以选择直接使用SQL语句.Content Provider 或 ORM(对象关系数据映射). 对于 Android 应用的开发,主要是使用Java语言,所以适用于Java语言的一些ORM,也能移植于 Android 平台上. 下面是5个可用ORM的总体介绍

ORM框架详解

.Net开源微型ORM框架测评 什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说,它其实是创建了一个可在编程语言里使用的"虚拟对象数据库". 一般的ORM包括以下四部分: 一个对持久类对象进行CRUD操作的API: 一个语言或API用来规定与类和类属性相关的查询: 一个规定MAPPING METADATA的工具: 一种

轻量型ORM框架Dapper的使用

在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我个人的见解,EF是相对来说比较重的ORM框架,它是讲究通用性的框架,而非单纯的实现某种需求的框架,不得不否认的说,EF的开发效率要比用单纯的ADO.NET写sql语句的效率高的不是一点半点,可能很多人会说EF的性能低等等,针对这种问题有时候是需要折中的来讲,从另一个方面来讲,你用了ADO.NET写s

Net框架下-ORM框架LLBLGen的简介(转载)

Net框架下-ORM框架LLBLGen的简介 http://www.cnblogs.com/huashanlin/archive/2015/02/12/4288522.html 官方网址:http://www.llblgen.com/

GreenDao开源ORM框架浅析

Android程序开发中,避免不了要用到数据库,我们都知道android提供了内置的Sqlite,即调用SQLiteOpenHelper的方法,来操作数据库,但是使用过程较为繁琐,从建表到对表中数据的正删改查操作,需要大量的代码来建立表,和完成这些操作. GreenDao居然是ORM框架,它跟hibernate是很像的,就是当你配置了一些参数信息之后,可以由框架来帮你生成对应的实体类,还有生成对应的操作实体类的代码(自动建表和基本的增删改查). 优点: 1.最大性能(最快的Android ORM

c# 轻量级ORM框架 实现(一)

发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋友会很好理解. 设计该框架的目的:不想重复的写增删改查,把精力放到功能实现上. 发布改框架的原因:希望给初学者一个参考,希望能给予好的建议,给自己一个展示机会. 在我开始之前,先说明一下,我对"软件工程学"概念东西几乎不通,最高文化程度:初二,所以不喜勿喷. 开始我的orm设计最底层 最底层的是一个DalBase,它是一个抽象的,实现了增删改查的基本操作. 它既然是一个抽象的,那么它的内部就

ORM框架疏理——廖雪峰实战系列(一)

ORM(Object Relational Mapping,对象关系映射),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上来说,它其实创建了一个可在编程语言里使用的"虚拟对象数据库". 上面是维基百科的解释,但是为什么要用ORM这种编程技术呢? 就这个实战作业来看: 博客--标题.摘要.内容.评论.作者.创作时间 评论--内容.评论人.评论文章.评论时间 用户--姓名.邮箱.口令.权限 上述信息,都需要有组织的存储在数据库中.数据库方面很简单,只需

C#轻型ORM框架PetaPoco试水

近端时间从推酷app上了解到C#轻微型的ORM框架--PetaPoco.从github Dapper 开源项目可以看到PetaPoco排第四 以下是网友根据官方介绍翻译,这里贴出来. PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项--单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的Poco类,和几乎全部加了特性的Poco类 Insert/Delete/Update/Save and IsNew