前言#
刚我们搭建好了环境和项目,现在我们准备将数据库接入到我们的项目中以及建表。
项目地址:
https://github.com/1714080902120/rust_rocket_crud_demo由于我是先实现完再写的这篇文章,如果有些地方无法运行,可以看下我项目里的代码。
叠甲:我还在往全栈的方向学习,所以如果看的不顺眼,请多多包涵。如果觉得那里可以改进,麻烦评论区说下,谢谢~
建表#
简单的分析
我们需要两个表:article和user,这两个表放在名为blog的数据库里。
另外如果你还没有搭建好数据库,你可以看这篇文章:坏蛋Dan:docker安装postgresSQL和数据持久化
article#

id:主键,这里用的类型是UUID,这样就可以避免id为数字带来的一些问题title:文章的标题description:最开始这个字段是用来存储文章内容,但是后面想了下还是放弃了,改用文件存储内容,这个字段是用于文章的简介author_id:外键,和user表的主键id关联。方便根据文章id查询作者信息。modify_time:修改时间,时间戳。is_publish:是否发布了,用于草稿,如果为false,文章将无法被查询到。
我是用HeidiSQL[1]直接可视化搭建的,你也可以这么做,不过这里还是贴下代码
CREATE TABLE "article" (
"id" UUID NOT NULL,
"title" VARCHAR(1000) NOT NULL,
"description" VARCHAR(1000) NOT NULL,
"author_id" UUID NOT NULL,
"modify_time" BIGINT NOT NULL,
"is_publish" BOOLEAN NULL DEFAULT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "author_id" FOREIGN KEY ("author_id") REFERENCES "user" ("id") ON UPDATE NO ACTION ON DELETE NO ACTION
)
;
COMMENT ON COLUMN "article"."id" IS '';
COMMENT ON COLUMN "article"."title" IS '';
COMMENT ON COLUMN "article"."description" IS '';
COMMENT ON COLUMN "article"."author_id" IS '';
COMMENT ON COLUMN "article"."modify_time" IS '';
COMMENT ON COLUMN "article"."is_publish" IS '';user#

id:主键。name:用户名。description:作者个人介绍。email:邮箱,必填,用于登录。phone:手机号,必填,也是用于登录,即提供两个索引条件,可以是邮箱也可以是手机号。pwd:密码,在入库之前会进行md5加密处理create_time:注册时间,时间戳。
CREATE TABLE "user" (
"id" UUID NOT NULL,
"name" VARCHAR(255) NOT NULL,
"description" VARCHAR(255) NOT NULL,
"email" VARCHAR(255) NOT NULL,
"pwd" VARCHAR(255) NOT NULL,
"phone" BIGINT NOT NULL,
"create_time" BIGINT NOT NULL,
PRIMARY KEY ("id")
)
;
COMMENT ON COLUMN "user"."id" IS '';
COMMENT ON COLUMN "user"."name" IS '';
COMMENT ON COLUMN "user"."description" IS '';
COMMENT ON COLUMN "user"."email" IS '';
COMMENT ON COLUMN "user"."pwd" IS '';
COMMENT ON COLUMN "user"."phone" IS '';
COMMENT ON COLUMN "user"."create_time" IS '';到这我们的表就建立完毕了,可以准备接入到项目中了。
配置#
前面我们已经引入了依赖,但是我们还不能直接使用它,我们需要有一个桥梁告知rocket我们的数据库在哪。
我们在rocket简单入门那篇文章里有说到,我们可以通过config的方式去告知rocket。这里我选择通过global的方式来告知。
Rocket.toml#
和blog-server的Cargo.toml同级 (注意如果你是用的workspace,那么这里就不能使用cargo run -p的指令,因为查找文件的路径不对会导致读不到rocket.toml文件)。
我们在这个文件中配置下连接指向的数据库
[global.databases]
blog = { url = "postgresql://[db_user_name]:[db_password]@[db_url]:[db_port]/[db_name]" }db_user_name默认是postgresdb_password是你搭建数据库的时候设置的,也可以手动去改。db_url如果是本地的话则是127.0.0.1,如果是云服务器则是你服务器的公网地址。db_port则是你docker往外暴露的端口,一般和数据库暴露出来的一一对应,不过根据你个人的配置也可以不一样,常见的都是5432。db_name自然就是你数据库的名字。
创建DB实例#
我们的数据库名字叫blog,所以这里我们创建的自然是blog的实例。
我们来到src文件夹下创建一个db的文件夹,然后里面创建一个mod.rs,这个mod.rs是这个模块的出入口,我们以前学rust基础知识的时候有说到过,如果你的文件夹里面有一个mod.rs文件,那么rust会自动索引到它。rust基础学习--day14 - 知乎 (zhihu.com)
use rocket_db_pools::{sqlx::PgPool, Connection, Database, Initializer};
#[derive(Database)]
#[database("blog")]
pub struct Blog(PgPool);
pub fn init_db_blog() -> Initializer<Blog> {
Blog::init()
}
pub type BlogDBC = Connection<Blog>;Database[2]: 这是个派生宏,用于给我们的结构体实现Database[3]这个trait。database:一个属性用来指向我们的db name。PgPool:postgres(以后就直接简称pg了)数据库连接池。Initializer:这个则是实例的类型BlogDBC:是我封装的类型,之后会在路由那边使用到
然后我们去到main.rs文件中,把我们刚写的init_db_blog引入。
#[macro_use] extern crate rocket;
mod db;
use db::init_db_blog;
#[get("/")]
fn index() -> &'static str {
"Hello, world!"
}
#[launch]
fn rocket() -> _ {
rocket::build().attach(init_db_blog()).mount("/", routes![index])
} 那么这样我们就接入好了,接下来我们可以开始实现了。不过下一章还不是实现,我们需要提前做一些全局配置,这样方便后面做一些事情。
总结#
没有
参考#
- ^HeidiSQL https://www.heidisql.com/
- ^rocket_db_pools::Database https://docs.rs/rocket_db_pools/0.1.0-rc.3/rocket_db_pools/derive.Database.html
- ^Database https://docs.rs/rocket_db_pools/0.1.0-rc.3/rocket_db_pools/derive.Database.html
发布于 2023-06-07 18:00・IP 属地广东
