rust前哨站_rust - diesel 1 的安装与使用 (连接数据库,读取)
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 的安装与使用 (连接数据库,读取)相关推荐
- rust前哨站_Rust
随着软件业的蓬勃发展,越来越多的新技术开始呈现在大家面前.比如Golang和Rust这两门计算机编程语言. Golang可能大家接触的多一些,毕竟容器和区块链等大量开发者在用.稍晚一年出现的Rust, ...
- rust前哨站_Steam周销榜更新:Rust突然爆火登顶 第二名依旧是VR套件
上周的Steam周销榜可能国内很多玩家完全没有猜到,第一名属于一款曾经的爆款游戏腐蚀Rust,不过在这款游戏国内禁播以后热度已经非常低了,下面我们来看一下这个榜单的详情吧. V社公布了最新一周Stea ...
- 我的世界基岩版种子和java版种子_我的世界:两个基岩版“神种”,55米高的前哨站,裸露的村庄要塞...
作为一个喜欢用电脑玩游戏的玩家,迷恋一直以来使用较多的都是<我的世界>Java版,这一点经常看我文章的玩家应该也十分清楚.正是因为本人基岩版玩的过少,因此每次地图种子推荐的时候都是以Jav ...
- 一万个bug——安装阿里云SDK核心库遇到的问题(涉及Rust、cryptography、openssl等的安装)
本文涉及Rust.cryptography.openssl等的安装 ----解决方式都是硬方式(仅凭报错信息分析,没有技术分析,按需参考) 其中: Rust 安装时遇到的问题在1-5 cryptogr ...
- Ubuntu下使用Anaconda安装opencv 解决无法读取视频
Ubuntu下使用Anaconda安装opencv 最近在Ubuntu16.04下使用Anaconda安装opencv,碰到很多坑,记录备忘. cv2.VideoCapture(filename) 返 ...
- Py之Xlrd:Xlrd简介、安装、使用方法(读取xlsx文件的shee表头名/总行数/总列数、每一行的内容、指定列的内容)之详细攻略
Py之Xlrd:Xlrd简介.安装.使用方法(读取xlsx文件的shee表头名/总行数/总列数.每一行的内容.指定列的内容)之详细攻略 导读 xlrd,xlwt和xlutils是用Pyth ...
- hdfs用fileutil读取文件内容_MoviePy - 用Python玩转视频剪辑!(MoviePy安装及视频文件读取)
最近有一些视频需要剪辑,但本人比较懒,不想逐一手工处理.第一个想到的,就是万能的Python. 果不其然google一搜,真的有现成的库 moviepy.如官方文档所介绍的,moviepy是一个用于视 ...
- PL/SQL TOAD 不安装Oracle客户端连接数据库的方法
不安装Oracle客户端连接数据库的方法 本机环境: win7 64位中文旗舰版 一.准备工作: 1)到ORACLE官网下载instantclient,下载地址:http://www.oracle.c ...
- Ruo-Yi 前后端分离防止XSS攻击和自定义可以重复读取InputStream流
Ruo-Yi 前后端分离防止XSS攻击和自定义可以重复读取InputStream流 防止XSS攻击分析 1.什么是xss攻击 **XSS 即(Cross Site Scripting)中文名称为: ...
最新文章
- wordpress php 7 速度优化,WordPress优化提速必做的6种操作代码篇
- pagefile.sys
- C/C++面试题—链表中倒数第k个结点
- CWE 4.3:强化你的数据自我保护能力
- 关于androidAsyncHttp支持https
- HashMap底层实现原理概述
- dubbo的工作原理
- 中文地址识别api的使用测试,快递地址自动补全,自动识别省市区,地址清洗,到底哪个好用?
- 90后首次购房心路历程
- 人员玩手机离岗识别检测系统 yolov5
- spm + host
- 什么是5G前传、中传、回传?
- 让犯罪有迹可寻,区块链存证被最高人民法院认可
- 关于java开发mc模组出现的问题
- 首届SD-WAN实战特训营
- win7和win10双系统安装教程
- 通过树结构的演变以及实现来辩证的看数据结构
- windows10+python3.5下同时安装caffe和tensorflow
- Hosts文件位置及介绍
- vscode的下载与插件安装