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

举报
黎燃 发表于 2024/08/14 22:03:22 2024/08/14
【摘要】 Diesel我们需要告诉Diesel我们在哪里可以找到我们的数据库。我们通过设置环境变量来实现这一点。在我们的开发机器上,我们可能有多个项目,我们不想污染我们的环境。我们可以将url放在文件中。数据库_ URL.envecho DATABASE_URL=postgres://username:password@localhost/diesel_demo > .env这将创建我们的数据库(如...

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。