rust - diesel 1 的安装与使用 (连接数据库,读取)

2020-05-18 17:03

访问量: 846

分类:

技术

diesel 是 rust世界的 持久层框架。 官方网址  diesel.rs  (域名很有意思)

截止 2020-5-18 , 5500关注, 支持的数据库是  postgres, mysql , sqlite

一 创建数据库,表,映射,并查询数据

1. cargo new --lib test_diesel

会创建一个新文件夹: test_diesel

2. 修改Cargo.toml

[dependencies]

diesel = { version = "1.0.0", features = ["postgres"] }

dotenv = "0.9.0"

3. cargo install diesel_cli

4. 增加新文件: .env  , 内容如下:

DATABASE_URL=mysql://root:666666@localhost/diesel_demo

5. $ diesel setup  , 会分别创建一个文件夹和一个数据库

Creating migrations directory at: /workspace/test_rust/test_diesel2/migrations

Creating database: diesel_demo

6. 运行migration

diesel migration generate create_posts

分别增加对应的up/down.sql

up.sql:  ( 这里是mysql的语句, 跟官方自带的postgres语句不太一样,稍有修改)

create table posts (

id int(11) not null auto_increment,

title varchar(255) not null,

body text,

published boolean not null default false,

primary key (`id`)

)

down.sql:

drop database posts

7. 运行:

diesel migration run  ( 回退的话,就用redo)

这个操作会自动的更新 src/schema.rs 的内容:

table! {

posts (id) {

id -> Integer,

title -> Varchar,

body -> Nullable,

published -> Bool,

}

}

8. 连接数据库:

src/lib.rs

#[macro_use]

extern crate diesel;

extern crate dotenv;

pub mod models;

pub mod schema;

use diesel::prelude::*;

use dotenv::dotenv;

use std::env;

pub fn establish_connection() -> MysqlConnection {

dotenv().ok();

let database_url = env::var("DATABASE_URL")

.expect("DATABASE_URL must be set");

MysqlConnection::establish(&database_url)

.unwrap_or_else(|_| panic!("error connecting to {}", database_url));

}

9. 增加: src/models.rs 作为 持久层的映射。

// 这里的 order struct中的属性的顺序一定要跟 schema.rs 中的order表中的列的顺序一致。

#[derive(Queryable)]

pub struct Order {

pub id: i32,

pub title: String,

pub body: Option,

pub published: bool,

}

10.  src/bin/show_posts.rs

src/bin/show_posts.rs

// 声明需要用到的外部模块

extern crate test_diesel2;

extern crate diesel;

use self::test_diesel2::*;

use self::models::*;

use self::diesel::prelude::*;

fn main(){

use test_diesel2::schema::posts::dsl::*;

let connection = establish_connection();

let results = posts.filter(published.eq(true))

.limit(5)

.load::(&connection)

.expect("Error loading posts");

println!("Displaying {} posts", results.len());

for post in results {

println!("======");

println!("{:?}", post.title);

println!("{:?}", post.body);

}

}

11. 运行: cargo run ,就可以看到,读取数据库的内容了:

cargo run

Finished dev [unoptimized + debuginfo] target(s) in 0.03s

Running `target/debug/show_posts`

Displaying 0 posts

二. 我们开始创建新记录

修改 models.rs 增加以下内容:

use super::schema::posts;

#[derive(Insertable)]

#[table_name="posts"]

pub struct NewPost {

pub title: &'a str,

pub body: &'a str,

}

创建src/bin/write_post.rs , 增加以下内容:

extern crate test_diesel2;

extern crate diesel;

use self::test_diesel2::*;

use std::io::{stdin, Read};

fn main() {

let connection = establish_connection();

let post = create_post(&connection, "lalala", "I am the body");

println!(" saved title : lalaal with ");

}

为 src/lib.rs 增加以下内容:

use self::models::{Post, NewPost};

pub fn create_post(conn: &MysqlConnection, title: &'a str, body: &'a str) {

use schema::posts;

let new_post = NewPost{

title: title,

body: body,

};

diesel::insert_into(posts::table)

.values(&new_post)

.execute(conn)

.expect("Error saving new post");

}

运行:cargo run --bin write_post

就可以看到,内容被保存了。 ( 这里id 不会返回, 需要调用 select last_insert_id() 来 获得最新的id )

rust前哨站_rust - diesel 1 的安装与使用 (连接数据库,读取)相关推荐

  1. rust前哨站_Rust

    随着软件业的蓬勃发展,越来越多的新技术开始呈现在大家面前.比如Golang和Rust这两门计算机编程语言. Golang可能大家接触的多一些,毕竟容器和区块链等大量开发者在用.稍晚一年出现的Rust, ...

  2. rust前哨站_Steam周销榜更新:Rust突然爆火登顶 第二名依旧是VR套件

    上周的Steam周销榜可能国内很多玩家完全没有猜到,第一名属于一款曾经的爆款游戏腐蚀Rust,不过在这款游戏国内禁播以后热度已经非常低了,下面我们来看一下这个榜单的详情吧. V社公布了最新一周Stea ...

  3. 我的世界基岩版种子和java版种子_我的世界:两个基岩版“神种”,55米高的前哨站,裸露的村庄要塞...

    作为一个喜欢用电脑玩游戏的玩家,迷恋一直以来使用较多的都是<我的世界>Java版,这一点经常看我文章的玩家应该也十分清楚.正是因为本人基岩版玩的过少,因此每次地图种子推荐的时候都是以Jav ...

  4. 一万个bug——安装阿里云SDK核心库遇到的问题(涉及Rust、cryptography、openssl等的安装)

    本文涉及Rust.cryptography.openssl等的安装 ----解决方式都是硬方式(仅凭报错信息分析,没有技术分析,按需参考) 其中: Rust 安装时遇到的问题在1-5 cryptogr ...

  5. Ubuntu下使用Anaconda安装opencv 解决无法读取视频

    Ubuntu下使用Anaconda安装opencv 最近在Ubuntu16.04下使用Anaconda安装opencv,碰到很多坑,记录备忘. cv2.VideoCapture(filename) 返 ...

  6. Py之Xlrd:Xlrd简介、安装、使用方法(读取xlsx文件的shee表头名/总行数/总列数、每一行的内容、指定列的内容)之详细攻略

    Py之Xlrd:Xlrd简介.安装.使用方法(读取xlsx文件的shee表头名/总行数/总列数.每一行的内容.指定列的内容)之详细攻略  导读      xlrd,xlwt和xlutils是用Pyth ...

  7. hdfs用fileutil读取文件内容_MoviePy - 用Python玩转视频剪辑!(MoviePy安装及视频文件读取)

    最近有一些视频需要剪辑,但本人比较懒,不想逐一手工处理.第一个想到的,就是万能的Python. 果不其然google一搜,真的有现成的库 moviepy.如官方文档所介绍的,moviepy是一个用于视 ...

  8. PL/SQL TOAD 不安装Oracle客户端连接数据库的方法

    不安装Oracle客户端连接数据库的方法 本机环境: win7 64位中文旗舰版 一.准备工作: 1)到ORACLE官网下载instantclient,下载地址:http://www.oracle.c ...

  9. Ruo-Yi 前后端分离防止XSS攻击和自定义可以重复读取InputStream流

    Ruo-Yi 前后端分离防止XSS攻击和自定义可以重复读取InputStream流 防止XSS攻击分析 1.什么是xss攻击 ​ **XSS 即(Cross Site Scripting)中文名称为: ...

最新文章

  1. wordpress php 7 速度优化,WordPress优化提速必做的6种操作代码篇
  2. pagefile.sys
  3. C/C++面试题—链表中倒数第k个结点
  4. CWE 4.3:强化你的数据自我保护能力
  5. 关于androidAsyncHttp支持https
  6. HashMap底层实现原理概述
  7. dubbo的工作原理
  8. 中文地址识别api的使用测试,快递地址自动补全,自动识别省市区,地址清洗,到底哪个好用?
  9. 90后首次购房心路历程
  10. 人员玩手机离岗识别检测系统 yolov5
  11. spm + host
  12. 什么是5G前传、中传、回传?
  13. 让犯罪有迹可寻,区块链存证被最高人民法院认可
  14. 关于java开发mc模组出现的问题
  15. 首届SD-WAN实战特训营
  16. win7和win10双系统安装教程
  17. 通过树结构的演变以及实现来辩证的看数据结构
  18. windows10+python3.5下同时安装caffe和tensorflow
  19. Hosts文件位置及介绍
  20. vscode的下载与插件安装

热门文章

  1. 西南大学考研计算机808真题和复试
  2. Vue2,Webpack的基础配置以及使用脚手架创建工程
  3. php ajax 实现三级省市区联动
  4. 十二时辰手把手教你入门Spring
  5. win7正版版本分析
  6. Java开发基础——配置文件的写入与读取
  7. 安全加密 - 秘钥和算法关系
  8. 通俗理解 三次握手四次挥手(老友依恋式)
  9. Volar - vue终极开发神器!
  10. 智能温度、电压监测系统