Diesel框架对于数据库的使用和实战,在PostgreSQL的基础上的使用【Diesel】

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: Diesel框架对于数据库的使用和实战,在PostgreSQL的基础上的使用【Diesel】
## Diesel
我们需要告诉Diesel我们在哪里可以找到我们的数据库。我们通过设置环境变量来实现这一点。在我们的开发机器上,我们可能有多个项目,我们不想污染我们的环境。我们可以将url放在文件中。数据库_ URL.env

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

这将创建我们的数据库(如果它还不存在),并创建一个空的迁移目录,我们可以使用它来管理我们的体系结构(稍后将详细介绍)。
现在,我们将编写一个小型CLI来管理博客(忽略了我们只能从该CLI访问数据库的事实……我们首先需要一个表来存储我们的帖子。让我们为此创建一个迁移。

Creating migrations/20160815133237_create_posts/up.sql
Creating migrations/20160815133237_create_posts/down.sql

我们还希望创建一个结构,在该结构中我们可以读取数据,并让diesel生成用于引用查询中的表和列的名称。邮递
我们将在以下行的顶部添加以下行:src/lib.rs

CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR NOT NULL,
body TEXT NOT NULL,
published BOOLEAN NOT NULL DEFAULT FALSE
)

use diesel::prelude::*;

[derive(Queryable)]

pub struct Post {

pub id: i32,
pub title: String,
pub body: String,
pub published: bool,

}

[derival(Queryable)]将生成从SQL查询加载结构所需的所有代码。邮递
通常,模式模块不是手动创建的,而是由柴油发动机生成的。运行时,我们创建一个名为diesel的文件。toml,它告诉Diesel在rs上的src/schema文件中维护一个文件

use self::models::*;
use diesel::prelude::*;
use diesel_demo::*;

fn main() {

use self::schema::posts::dsl::*;

let connection = &mut 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);
}

}


确切的输出可能因数据库而异,但应该是等效的。
表宏基于数据库模式创建代码堆栈,以表示所有表和列。我们将在下一个示例中详细了解如何使用它。
每当我们运行或恢复迁移时,此文件都会自动更新。
现场订单说明
使用结构上字段的假定顺序来匹配表中的列,因此确保按照文件#[derival(Queryable)]Postpostsschema.rs中的顺序定义它们
让我们编写代码来实际展示我们的帖子。

use crate::schema::posts;

[derive(Insertable)]

[diesel(table_name = posts)]

pub struct NewPost<'a> {

pub title: &'a str,
pub body: &'a str,

}


use行导入了一堆别名,因此我们可以说不是,但不是。当我们只处理一个表时,这很有用,但这并不总是我们想要的。self::schema::posts::dsl::*postposts::tablepublishedposts::published
我们可以使用它不幸的是,结果不会很有趣,因为我们在数据库中实际上没有任何帖子。然而,我们已经编写了大量代码,所以让我们提交。货仓展示柱
演示的完整代码可以在这里找到。
接下来,让我们编写一些代码来创建一篇新文章。我们需要一个插入新记录的结构。

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

pub fn create_post(conn: &mut PgConnection, title: &str, body: &str) -> Post {

use crate::schema::posts;

let new_post = NewPost { title, body };

diesel::insert_into(posts::table)
    .values(&new_post)
    .get_result(conn)
    .expect("Error saving new post")

}

当我们调用insert或update语句时,它会自动添加到查询的末尾,并允许我们将其加载到为正确类型实现的任何结构中。整洁获取_结果返回*可查询
Diesel可以在单个查询中插入多个记录。只需将或切片传递给,然后调用而不是。如果您实际上不想对刚刚插入的行执行任何操作,请调用。编译器不会像这样抱怨你。:)Vecinsertget_resultsget_result.execute
现在,我们已经设置好了一切,我们可以创建一个小脚本来编写一篇新文章。

use self::models::Post;
use diesel::prelude::*;
use diesel_demo::*;
use std::env::args;

fn main() {

use self::schema::posts::dsl::{posts, published};

let id = args()
    .nth(1)
    .expect("publish_post requires a post id")
    .parse::<i32>()
    .expect("Invalid ID");
let connection = &mut establish_connection();

let post = diesel::update(posts.find(id))
    .set(published.eq(true))
    .get_result::<Post>(connection)
    .unwrap();
println!("Published post {}", post.title);

}

然而,我们仍然只涵盖CRUD四个字母中的三个。让我们向您展示如何删除内容。有时我们写一些我们非常讨厌的东西,以至于我们没有时间查找ID。所以,让我们从标题中删除一些单词,甚至只是删除标题中的一些单词。

Compiling diesel_demo v0.1.0 (file:///Users/sean/Documents/Projects/open-source/diesel_demo)

 Running `target/debug/delete_post demo`

Deleted 1 posts


当我们再次尝试运行它时,我们可以看到该帖子实际上已被删除。这很难触及柴油机的表面,但我希望本教程为您提供了一个良好的基础。我们建议您浏览API文档以获取更多信息。您可以在这里找到本教程的最终代码。货仓展示柱
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
16天前
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
1天前
|
SQL 关系型数据库 数据库连接
Python连接线上数据库的实战指南
Python连接线上数据库的实战指南
9 1
|
8天前
|
SQL 存储 关系型数据库
关系型数据库中的PostgreSQL
【6月更文挑战第11天】
45 3
|
8天前
|
关系型数据库 MySQL 数据库
上手体验 PolarDB-X 数据库
PolarDB-X,一款高性能云原生分布式数据库。
38 1
|
13天前
|
JavaScript 关系型数据库 MySQL
Python实战:从猎聘网获取职位信息并存入数据库
Python实战:从猎聘网获取职位信息并存入数据库
|
14天前
|
关系型数据库 数据库 PostgreSQL
PostgreSQL数据库的字符串拼接语法使用说明
【6月更文挑战第11天】PostgreSQL数据库的字符串拼接语法使用说明
31 1
|
16天前
|
SQL 关系型数据库 数据库
Python查询PostgreSQL数据库
木头左教你如何用Python连接PostgreSQL数据库:安装`psycopg2`库,建立连接,执行SQL脚本如创建表、插入数据,同时掌握错误处理和事务管理。别忘了性能优化,利用索引、批量操作提升效率。下期更精彩!💡 csvfile
Python查询PostgreSQL数据库
|
1天前
|
XML 关系型数据库 数据库
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
9 0
|
1天前
|
SQL 监控 Java
技术实战:Java数据库连接池优化策略解析
【6月更文挑战第24天】Java应用的数据库连接池优化关键在于参数调整、预编译SQL和监控。案例中,高并发购物系统初期使用C3P0,因参数不合理导致性能瓶颈。调整如设置`MinPoolSize`为10,`MaxPoolSize`为50,和`CheckoutTimeout`为3000ms,配合预编译SQL提升执行效率。通过JMX监控连接池状态,动态调优,确保系统响应速度和资源利用。
|
15天前
|
SQL 安全 数据库
精通SQL:数据库查询与管理的实战指南
一、引言 在当今数字化时代,[数据库](https://www.iyxwzx.com/)已成为企业、组织和个人不可或缺的数据[管理](https://www.iyxwzx.com/news/)工具