Rust में डेटाबेस के साथ काम करना: PostgreSQL और MongoDB व्यवहार में

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: क्यों Rust और डेटाबेस एक शक्तिशाली संयोजन हैं

\n

Rust एक सिस्टम प्रोग्रामिंग भाषा है जो C/C++ के प्रदर्शन को मेमोरी सुरक्षा के साथ जोड़ती है। हालांकि, लंबे समय तक Rust में डेटाबेस के साथ काम करने के पारिस्थितिकी तंत्र को "कच्चा" माना जाता था। आज स्थिति पूरी तरह से बदल गई है: लाइब्रेरीज़ sqlx (PostgreSQL के लिए) और आधिकारिक ड्राइवर mongodb परिपक्व, एसिंक्रोनस और सुरक्षित API प्रदान करते हैं।

\n

इस लेख में हम व्यवहार में देखेंगे कि Rust से PostgreSQL और MongoDB से कैसे जुड़ें, CRUD-संचालन करें और त्रुटियों को कैसे संभालें। सभी उदाहरण एसिंक्रोनस रनटाइम tokio का उपयोग करेंगे।

\n\n

1. प्रोजेक्ट सेटअप और निर्भरताएँ स्थापित करना

\n

एक नया Cargo प्रोजेक्ट बनाएँ:

\n
cargo new rust_db_example\ncd rust_db_example
\n

Cargo.toml में निम्नलिखित निर्भरताएँ जोड़ें:

\n
[dependencies]\ntokio = { version = "1", features = ["full"] }\nsqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }\nmongodb = "2.8"\nserde = { version = "1", features = ["derive"] }\nanyhow = "1"
\n
    \n
  • sqlx — PostgreSQL के लिए एसिंक्रोनस ड्राइवर जो संकलन समय पर क्वेरी की जाँच करता है।
  • \n
  • mongodb — MongoDB Inc. का आधिकारिक ड्राइवर।
  • serde — संरचनाओं के सीरियलाइज़ेशन/डीसीरियलाइज़ेशन के लिए।
  • anyhow — त्रुटियों को आसानी से संभालने के लिए।
\n\n

2. sqlx के माध्यम से PostgreSQL के साथ काम करना

\n

2.1 डेटाबेस से कनेक्शन

\n

कनेक्शन के लिए postgres://user:password@localhost/dbname प्रारूप के कनेक्शन स्ट्रिंग का उपयोग करें। उदाहरण:

\n
use sqlx::postgres::PgPool;\nuse anyhow::Result;\n\n#[tokio::main]\nasync fn main() -> Result<()> {\n    let pool = PgPool::connect("postgres://postgres:password@localhost/testdb").await?;\n    println!("PostgreSQL से कनेक्शन स्थापित!");\n    Ok(())\n}
\n\n

2.2 तालिका बनाना और डेटा सम्मिलित करना

\n

User संरचना को परिभाषित करें और माइग्रेशन करें:

\n
use serde::{Deserialize, Serialize};\nuse sqlx::FromRow;\n\n#[derive(Debug, Serialize, Deserialize, FromRow)]\nstruct User {\n    id: i32,\n    name: String,\n    email: String,\n}\n\nasync fn create_table(pool: &PgPool) -> Result<()> {\n    sqlx::query(\n        "CREATE TABLE IF NOT EXISTS users (\n            id SERIAL PRIMARY KEY,\n            name VARCHAR(255) NOT NULL,\n            email VARCHAR(255) NOT NULL UNIQUE\n        )"\n    )\n    .execute(pool)\n    .await?;\n    println!("users तालिका बनाई गई");\n    Ok(())\n}\n\nasync fn insert_user(pool: &PgPool, name: &str, email: &str) -> Result<User> {\n    let user = sqlx::query_as::<_, User>(\n        "INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id, name, email"\n    )\n    .bind(name)\n    .bind(email)\n    .fetch_one(pool)\n    .await?;\n    Ok(user)\n}
\n

$1, $2 पर ध्यान दें — ये पैरामीटराइज़्ड क्वेरी हैं जो SQL-इंजेक्शन से बचाती हैं।

\n\n

2.3 डेटा पढ़ना और अपडेट करना

\n
async fn get_user_by_email(pool: &PgPool, email: &str) -> Result<Option<User>> {\n    let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE email = $1")\n        .bind(email)\n        .fetch_optional(pool)\n        .await?;\n    Ok(user)\n}\n\nasync fn update_user_name(pool: &PgPool, id: i32, new_name: &str) -> Result<()> {\n    sqlx::query("UPDATE users SET name = $1 WHERE id = $2")\n        .bind(new_name)\n        .bind(id)\n        .execute(pool)\n        .await?;\n    println!("उपयोगकर्ता {} अपडेट किया गया", id);\n    Ok(())\n}
\n

fetch_optional का उपयोग करने से बिना पैनिक किए उस स्थिति को संभाला जा सकता है जब रिकॉर्ड नहीं मिलता।

\n\n

3. आधिकारिक ड्राइवर के माध्यम से MongoDB के साथ काम करना

\n

3.1 कनेक्शन और डेटाबेस चयन

ब्लॉग

पुस्तक अनुशंसाएँ