0Pricing
Learn Rust Coding · Pelajaran

Operasi CRUD

Melakukan query dan eksekusi

Operasi CRUD adalah pelajaran Learn Rust Coding gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Learn Rust Coding, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Learn Rust Coding mencakup 4 pelajaran total.

CRUD dengan sqlx

CRUD berarti Create, Read, Update, Delete. sqlx membagi operasi ini menjadi dua gaya eksekusi:

  • fetch_* untuk kueri yang mengembalikan baris
  • execute untuk pernyataan yang mengubah data

Create (INSERT)

Sisipkan satu baris dengan parameter terikat, lalu jalankan melalui execute. Gunakan RETURNING untuk mendapatkan kembali id yang dibuat.

use sqlx::{Pool, Postgres};

async fn create(pool: &Pool<Postgres>, name: &str) -> i32 {
    let rec = sqlx::query!(
        "INSERT INTO users (name) VALUES ($1) RETURNING id",
        name
    ).fetch_one(pool).await.unwrap();
    rec.id
}

Membaca satu baris

fetch_one mengharapkan tepat satu baris dan akan menghasilkan kesalahan jika tidak demikian. Gunakan fetch_optional jika baris tersebut mungkin tidak ada.

use sqlx::{Pool, Postgres};

async fn find(pool: &Pool<Postgres>, id: i32) -> Option<String> {
    let rec = sqlx::query!("SELECT name FROM users WHERE id = $1", id)
        .fetch_optional(pool)
        .await
        .unwrap();
    rec.map(|r| r.name)
}

Membaca banyak baris

fetch_all mengembalikan Vec yang berisi semua baris yang cocok.

use sqlx::{Pool, Postgres};

async fn all_names(pool: &Pool<Postgres>) -> Vec<String> {
    let rows = sqlx::query!("SELECT name FROM users ORDER BY id")
        .fetch_all(pool)
        .await
        .unwrap();
    rows.into_iter().map(|r| r.name).collect()
}

Memperbarui

Pernyataan UPDATE menggunakan execute, yang mengembalikan hasil berisi jumlah baris yang terpengaruh.

use sqlx::{Pool, Postgres};

async fn rename(pool: &Pool<Postgres>, id: i32, name: &str) -> u64 {
    let res = sqlx::query!("UPDATE users SET name = $1 WHERE id = $2", name, id)
        .execute(pool)
        .await
        .unwrap();
    res.rows_affected()
}

Menghapus

DELETE juga menggunakan execute. Periksa rows_affected() untuk mengetahui apakah ada sesuatu yang dihapus.

use sqlx::{Pool, Postgres};

async fn delete(pool: &Pool<Postgres>, id: i32) -> bool {
    let res = sqlx::query!("DELETE FROM users WHERE id = $1", id)
        .execute(pool)
        .await
        .unwrap();
    res.rows_affected() > 0
}

Memodelkan CRUD dalam Rust biasa

CRUD terhadap peta dalam memori mencerminkan operasi yang sama seperti yang dilakukan sqlx terhadap tabel.

use std::collections::HashMap;

fn main() {
    let mut users: HashMap<i32, String> = HashMap::new();
    users.insert(1, "Alice".to_string());      // create
    println!("{:?}", users.get(&1));            // read
    users.insert(1, "Alicia".to_string());      // update
    println!("{:?}", users.get(&1));
    users.remove(&1);                            // delete
    println!("{:?}", users.get(&1));
}

Transaksi

Kelompokkan beberapa pernyataan secara atomik dengan transaksi. Semuanya berhasil saat commit, atau tidak ada yang diterapkan.

use sqlx::{Pool, Postgres};

async fn transfer(pool: &Pool<Postgres>) {
    let mut tx = pool.begin().await.unwrap();
    sqlx::query!("UPDATE acct SET bal = bal - 10 WHERE id = 1")
        .execute(&mut *tx).await.unwrap();
    sqlx::query!("UPDATE acct SET bal = bal + 10 WHERE id = 2")
        .execute(&mut *tx).await.unwrap();
    tx.commit().await.unwrap();
}

Mengembalikan transaksi

Jika penjaga transaksi dihapus tanpa commit, sqlx akan mengembalikan transaksi secara otomatis. Anda juga dapat memanggil rollback secara eksplisit.

use sqlx::{Pool, Postgres};

async fn maybe(pool: &Pool<Postgres>, ok: bool) {
    let mut tx = pool.begin().await.unwrap();
    sqlx::query!("INSERT INTO log (msg) VALUES ('x')").execute(&mut *tx).await.unwrap();
    if ok { tx.commit().await.unwrap(); } else { tx.rollback().await.unwrap(); }
}

Mengalirkan pembacaan besar

Untuk kumpulan hasil yang sangat besar, fetch mengembalikan aliran sehingga Anda dapat memproses baris tanpa memuat semuanya ke memori.

use sqlx::{Pool, Postgres};
use futures::TryStreamExt;

async fn stream(pool: &Pool<Postgres>) {
    let mut rows = sqlx::query!("SELECT id FROM big_table").fetch(pool);
    while let Some(row) = rows.try_next().await.unwrap() {
        println!("id {}", row.id);
    }
}

Menangani kesalahan

Panggilan basis data mengembalikan Result. Teruskan kesalahan dengan ? dalam fungsi yang mengembalikan Result<_, sqlx::Error>, bukan dengan membatalkan program.

use sqlx::{Pool, Postgres};

async fn count(pool: &Pool<Postgres>) -> Result<i64, sqlx::Error> {
    let rec = sqlx::query!("SELECT COUNT(*) as n FROM users")
        .fetch_one(pool)
        .await?;
    Ok(rec.n.unwrap_or(0))
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang operasi CRUD.

Rangkuman

Anda telah mempelajari CRUD dengan sqlx:

  • fetch_one, fetch_optional, fetch_all membaca baris
  • execute mengubah data dan melaporkan rows_affected()
  • RETURNING mengambil nilai yang dibuat
  • Transaksi dengan begin/commit/rollback menjamin atomisitas

Berikutnya: migrasi untuk mengembangkan skema.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Operasi CRUD” gratis?

Ya — teks lengkap “Operasi CRUD” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Learn Rust Coding, upgrade ke CoddyKit PRO. Kursus Learn Rust Coding mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Operasi CRUD”?

Melakukan query dan eksekusi Kamu berlatih Learn Rust Coding dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Learn Rust Coding?

Tidak diperlukan pengalaman sebelumnya. Learn Rust Coding di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Operasi CRUD” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Learn Rust Coding ini?

Ya. Setiap pelajaran Learn Rust Coding menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menghubungkan ke Database
  2. Query yang Diperiksa saat Kompilasi
  3. Operasi CRUD
  4. Migrasi
← Kembali ke Learn Rust Coding