前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Diesel框架对于数据库的使用和实战,在PostgreSQL的基础上的使用【Diesel】

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

作者头像
上进小菜猪
发布2022-12-14 13:36:13
1K0
发布2022-12-14 13:36:13
举报
文章被收录于专栏:我想境境的开发专栏
代码语言:javascript
复制
## Diesel
我们需要告诉Diesel我们在哪里可以找到我们的数据库。我们通过设置环境变量来实现这一点。在我们的开发机器上,我们可能有多个项目,我们不想污染我们的环境。我们可以将url放在文件中。数据库_ URL.env

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

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

代码语言:javascript
复制
Creating migrations/20160815133237_create_posts/up.sql
Creating migrations/20160815133237_create_posts/down.sql

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

代码语言:javascript
复制
CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  title VARCHAR NOT NULL,
  body TEXT NOT NULL,
  published BOOLEAN NOT NULL DEFAULT FALSE
)
代码语言:javascript
复制
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文件中维护一个文件

代码语言:javascript
复制
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中的顺序定义它们 让我们编写代码来实际展示我们的帖子。

代码语言:javascript
复制
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 我们可以使用它不幸的是,结果不会很有趣,因为我们在数据库中实际上没有任何帖子。然而,我们已经编写了大量代码,所以让我们提交。货仓展示柱 演示的完整代码可以在这里找到。 接下来,让我们编写一些代码来创建一篇新文章。我们需要一个插入新记录的结构。

代码语言:javascript
复制
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 现在,我们已经设置好了一切,我们可以创建一个小脚本来编写一篇新文章。

代码语言:javascript
复制
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。所以,让我们从标题中删除一些单词,甚至只是删除标题中的一些单词。

代码语言:javascript
复制
   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文档以获取更多信息。您可以在这里找到本教程的最终代码。货仓展示柱

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档