Làm việc với cơ sở dữ liệu SQL trong Rust
Khi bạn xây dựng nhiều chương trình Rust hơn, bạn có thể cần tương tác với cơ sở dữ liệu để lưu trữ và truy xuất dữ liệu.
Khả năng gõ mạnh, an toàn bộ nhớ và hiệu suất của Rust, kết hợp với sự hỗ trợ của nó cho các hoạt động không đồng bộ, ORM và di chuyển, cho phép xử lý dữ liệu hiệu quả và có thể mở rộng, khiến Rust trở thành một lựa chọn tuyệt vời để xây dựng các ứng dụng cơ sở dữ liệu.
Mục Lục
Giới thiệu về Sử dụng Cơ sở dữ liệu SQL trong Rust
Có nhiều thùng cơ sở dữ liệu và thư viện trong hệ sinh thái Rust cung cấp hỗ trợ cho các mô hình cơ sở dữ liệu khác nhau.
Đối với cơ sở dữ liệu SQL, bạn có thể chọn giữa các trình điều khiển cơ sở dữ liệu như libpq, Trình kết nối MysqlVà Sqlite3 cung cấp giao diện cho các chương trình Rust tương tác trực tiếp với cơ sở dữ liệu mà không cần bất kỳ lớp trừu tượng nào trên SQL và ORM (Người lập bản đồ quan hệ đối tượng) như Dầu diesel, SqlxVà Rust-postgres cung cấp một cách thuận tiện để làm việc với cơ sở dữ liệu trên các loại dữ liệu Rust như cấu trúc và hàm.
Diesel ORM là một trong những gói cơ sở dữ liệu phổ biến nhất trong hệ sinh thái Rust. Là một ORM, Diesel cung cấp các tính năng từ xây dựng và thực thi truy vấn đến định nghĩa mô hình và di chuyển giản đồ cơ sở dữ liệu, giúp bạn tương tác với cơ sở dữ liệu dễ dàng hơn và viết mã hiệu quả, rõ ràng và dễ bảo trì.
Diesel cũng hỗ trợ nhiều công cụ cơ sở dữ liệu bao gồm PostgreSQL, MySQL và SQLite, đồng thời cung cấp một bộ tính năng mạnh mẽ để xử lý các hoạt động cơ sở dữ liệu phức tạp như giao dịch, tham gia và chức năng tổng hợp.
Với các công cụ, tính năng mạnh mẽ và tài liệu tuyệt vời, Diesel đã trở thành lựa chọn hàng đầu của nhiều nhà phát triển Rust đang tìm cách xây dựng các ứng dụng dựa trên dữ liệu mạnh mẽ và có thể mở rộng.
Bắt đầu với Diesel
Bạn sẽ phải thêm dầu diesel Và dotenv thùng cho các phụ thuộc của dự án của bạn trong phần phụ thuộc của bạn hàng hóa.toml tài liệu.
[dependencies]
diesel = { version = "1.4.4", features = ["sqlite"] }
dotenv = "0.15.0"
Sau khi thêm các thùng làm phụ thuộc, bạn phải cài đặt diesel_cli Công cụ CLI để tương tác với Diesel.
Chạy lệnh này để cài đặt diesel_cli dụng cụ:
cargo install diesel_cli
Bạn có thể gọi công cụ CLI bằng dầu diesel lệnh sau khi cài đặt công cụ.
Tiếp theo, tạo tệp biến môi trường và chỉ định URL cơ sở dữ liệu của bạn.
Chạy lệnh này để tạo và chèn URL cơ sở dữ liệu cho cơ sở dữ liệu SQLite trong bộ nhớ.
echo DATABASE_URL=database.db > .env
Để làm việc với Diesel, bạn phải cài đặt sqlite3 hoặc cơ sở dữ liệu ưa thích trên máy tính của mình.
Cuối cùng, chạy cài đặt lệnh để Diesel thiết lập cơ sở dữ liệu cho dự án của bạn:
diesel setup
Các cài đặt lệnh tạo ra một di cư thư mục, tạo cơ sở dữ liệu được chỉ định trong DATABASE_URLvà chạy các lần di chuyển hiện có.
Thiết lập di chuyển với Diesel
Sau khi thiết lập cơ sở dữ liệu của bạn với Diesel, bạn sẽ sử dụng di cư tạo ra lệnh để tạo tệp di chuyển. Bạn sẽ thêm tên của tệp làm đối số:
diesel migration generate create_humans
Lệnh tạo hai tệp SQL trong di cư danh mục: up.sql Và down.sql.
Bạn sẽ viết SQL cho các định nghĩa bảng cơ sở dữ liệu của mình trong up.sql tài liệu:
CREATE TABLE "human"
(
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"first_name" TEXT NOT NULL,
"last_name" TEXT NOT NULL,
"age" INTEGER NOT NULL
);
Bạn sẽ viết mã SQL để xóa các bảng cơ sở dữ liệu trong down.sql tài liệu:
DROP TABLE "human"
Sau khi ghi các tệp SQL, hãy chạy chạy di chuyển lệnh để áp dụng di chuyển đang chờ xử lý.
diesel migration run
Ngoài ra, bạn có thể sử dụng các di cư làm lại lệnh hoàn nguyên di chuyển:
diesel migration redo
Ngoài ra, bạn có thể sử dụng sơ đồ in lệnh để in lược đồ. Lệnh in nội dung của lược đồ.rs tài liệu.
diesel print-schema
đầu ra của print_schema lệnh là mã Rust phù hợp với lược đồ SQL của bạn:
Kết nối với cơ sở dữ liệu SQL của bạn với Diesel
Đầu tiên, thêm các lệnh nhập và chỉ thị này vào tệp của bạn:
mod schema;#[macro_use]
extern crate diesel;
use dotenv::dotenv;
use diesel::prelude::*;
use std::env;
use Diesel::{Connection, ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection};
use crate::schema::human;
Bạn sẽ sử dụng các lệnh nhập và chỉ thị để kết nối với cơ sở dữ liệu của mình và thực hiện các thao tác.
Đây là cách bạn có thể kết nối với cơ sở dữ liệu SQLite bằng một hàm và trả về một phiên bản kết nối:
use std::env;
use diesel::{Connection, SqliteConnection};fn establish_connection() -> SqliteConnection {
dotenv().ok();
let database_url = env::var("DATABASE_URL")
.expect("DATABASE_URL must be set");
SqliteConnection::establish(&database_url)
.unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
}
Các thiết lập_kết nối hàm trả về thể hiện kết nối struct (Kết nối Sqlite). Các thiết lập_kết nối tải các biến môi trường với Được rồi chức năng, truy cập URL cơ sở dữ liệu với var chức năng và thiết lập kết nối với cơ sở dữ liệu thông qua URL với thành lập chức năng.
Sau khi kết nối thành công, bạn có thể thực hiện các truy vấn và chèn chúng vào cơ sở dữ liệu của mình.
Chèn giá trị vào cơ sở dữ liệu với Diesel
Bạn sẽ sử dụng một cấu trúc phù hợp với lược đồ SQL của mình để chèn các giá trị vào cơ sở dữ liệu của mình.
Đây là một cấu trúc phù hợp với nhân loại lược đồ bảng:
#[derive(Queryable)]
pub struct Human {
pub id: i32,
pub first_name: String,
pub last_name: String,
pub age: i32,
}
Hàm chèn sẽ trả về một thể hiện của Nhân loại loại cho các hoạt động khác.
Bạn sẽ cần một cấu trúc cho chức năng chèn của mình; cấu trúc sẽ triển khai hai thuộc tính macro, một thuộc tính cho chức năng chèn và thuộc tính còn lại xác định bảng cho thao tác.
Đây là cấu trúc cho thao tác chèn:
#[derive(Insertable)]
#[table_name = "human"]
struct NewHuman<'a> {
first_name: &'a str,
last_name: &'a str,
age: i32,
}
Chức năng chèn của bạn sẽ lấy một phiên bản kết nối và dữ liệu bạn muốn chèn vào cơ sở dữ liệu. Chèn dữ liệu và in thông báo dựa trên trạng thái hoạt động.
fn insert_into<'a>(conn: &SqliteConnection, first_name: &'a str, last_name: &'a str, age: i32) -> Human {
use crate::schema::human; let new_human = NewHuman {
first_name,
last_name,
age,
};
diesel::insert_into(human::table).values(&new_human).execute(conn).expect("Error inserting new human");
human::table.order(human::id.desc()).first(conn).unwrap()
}
Các chèn vào hàm nhận các tham số và chèn các giá trị vào cơ sở dữ liệu với Diesel’s chèn vào hàm nhận trong bảng và giá trị hàm nhận trong một thể hiện cấu trúc. Hàm gán ID theo thứ tự giảm dần với giải thích chức năng trước khi thực hiện thao tác.
Đây là chủ yếu chức năng gọi các chèn vào chức năng:
fn main() {
let conn = establish_connection();
let new_human = insert_into(&conn, "John", "Doe", 25);
println!("New human inserted with ID: {}", new_human.id);
}
Các liên kết biến là một thể hiện kết nối và new_human biến là lệnh gọi hàm. Các chủ yếu chức năng in ID sau khi thao tác thành công.
Truy vấn cơ sở dữ liệu với Diesel
Ngoài ra, cấu trúc chức năng truy vấn của bạn sẽ thực hiện Có thể truy vấn thuộc tính với một lấy được vĩ mô.
Đây là cấu trúc cho hoạt động truy vấn:
#[derive(Queryable)]
struct Human {
id: i32,
first_name: String,
last_name: String,
age: i32,
}
Hàm truy vấn sẽ nhận một phiên bản kết nối và trả về một Nhân loại cấu trúc như sau:
fn query_db(conn: &SqliteConnection) -> Human {
human.filter(age.eq(25)).first(conn).expect("Error querying database")
}
Các truy vấn_db chức năng lọc bảng con người cho hàng nơi tuổi bằng 25 và trả về lần xuất hiện đầu tiên dưới dạng một thể hiện cấu trúc.
fn main() { let conn = establish_connection();
let person = query_db(&conn);
println!("ID: {}", person.id);
println!("First Name: {}", person.first_name);
println!("Last Name: {}", person.last_name);
println!("Age: {}", person.age);
}
bên trong chủ yếu chức năng, các người biến gọi các truy vấn_db và in các trường của hàng có giá trị tuổi bằng 25.
Bạn có thể xây dựng máy chủ web với Rust
Rust tiếp tục trở nên phổ biến trong phát triển web dưới dạng ngôn ngữ phía máy chủ với các thư viện như Actix-web Và tên lửa giúp thiết lập máy chủ và xây dựng API và trang web dễ dàng hơn bằng cách trừu tượng hóa chức năng phức tạp.
Hầu hết các máy chủ web phải tương tác với cơ sở dữ liệu để lưu trữ và truy xuất dữ liệu. Bạn có thể tích hợp thêm các ứng dụng do Diesel cung cấp với Actix-web hoặc Rocket để xây dựng các ứng dụng web phức tạp.