SQLx Rust: पूरी गाइड उदाहरणों के साथ

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

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

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

SQLx क्या है और इसकी आवश्यकता क्यों है?

SQLx एक एसिंक्रोनस, शुद्ध Rust लाइब्रेरी है जो डेटाबेस के साथ काम करने के लिए "SQL बिना ORM" दृष्टिकोण को लागू करती है। Diesel या SeaORM जैसे ORM समाधानों के विपरीत, SQLx SQL क्वेरी को एब्स्ट्रैक्शन के पीछे नहीं छिपाता, बल्कि आपको शुद्ध SQL कोड लिखने की अनुमति देता है, साथ ही कंपाइलेशन के समय पूर्ण टाइप सुरक्षा प्रदान करता है।

SQLx के मुख्य लाभ:

  • कंपाइल टाइम पर टाइप सुरक्षा — SQLx आपके SQL क्वेरी को प्रोजेक्ट बिल्ड के दौरान डेटाबेस स्कीमा के अनुसार जांचता है।
  • बिल्ट-इन एसिंक्रोनस — लाइब्रेरी पूरी तरह से async/await को सपोर्ट करती है, जो हाई-लोड वेब एप्लिकेशन के लिए आदर्श है।
  • कई DBMS का समर्थन — PostgreSQL, MySQL, SQLite और MSSQL।
  • कोई जादू नहीं — आप सामान्य SQL लिखते हैं, लाइब्रेरी केवल पैरामीटर को सुरक्षित रूप से पास करने और परिणाम प्राप्त करने में मदद करती है।
  • माइग्रेशन — डेटाबेस स्कीमा माइग्रेशन के लिए बिल्ट-इन सिस्टम।

SQLx उन प्रोजेक्ट्स के लिए आदर्श है जहां क्वेरी पर पूर्ण नियंत्रण, प्रदर्शन और टाइप सुरक्षा महत्वपूर्ण है, लेकिन ORM के जटिल DSL (डोमेन-स्पेसिफिक लैंग्वेज) सीखने की इच्छा नहीं है।

इंस्टॉलेशन

SQLx को Cargo पैकेज मैनेजर के माध्यम से इंस्टॉल किया जाता है। Cargo.toml फ़ाइल में डिपेंडेंसी जोड़ें:

[dependencies]
sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }
tokio = { version = "1", features = ["full"] }
anyhow = "1.0"

आपके द्वारा उपयोग किए जाने वाले डेटाबेस के अनुसार उपयुक्त feature-फ़्लैग चुनें:

  • postgres — PostgreSQL के लिए
  • mysql — MySQL के लिए
  • sqlite — SQLite के लिए
  • mssql — Microsoft SQL Server के लिए

Runtime के लिए आप runtime-tokio-rustls (अनुशंसित) या runtime-async-std-rustls चुन सकते हैं।

त्वरित शुरुआत

एक सरल एप्लिकेशन बनाते हैं जो PostgreSQL से कनेक्ट होता है और एक क्वेरी निष्पादित करता है:

use sqlx::postgres::PgPoolOptions;
use anyhow::Result;

#[tokio::main]
async fn main() -> Result<()> {
    // कनेक्शन पूल बनाएं
    let pool = PgPoolOptions::new()
        .max_connections(5)
        .connect("postgres://user:password@localhost/mydb")
        .await?;

    // एक सरल क्वेरी निष्पादित करें
    let row: (i64,) = sqlx::query_as("SELECT $1::bigint")
        .bind(42_i64)
        .fetch_one(&pool)
        .await?;

    println!("परिणाम: {}", row.0);

    Ok(())
}

यह कोड डेटाबेस के लिए 5 कनेक्शन का एक पूल बनाता है, एक पैरामीटर के साथ क्वेरी निष्पादित करता है और परिणाम प्रदर्शित करता है।

SQLx के मुख्य तरीके और फंक्शन

1. sqlx::query

यह क्या करता है: पैरामीटर बाइंडिंग की क्षमता के साथ एक नया SQL क्वेरी बनाता है। यह सभी ऑपरेशनों के लिए मूलभूत बिल्डिंग ब्लॉक है।

पैरामीटर:

  • sql: &str — प्लेसहोल्डर ($1, $2 PostgreSQL के लिए; ? MySQL/SQLite के लिए) के साथ SQL क्वेरी स्ट्रिंग

उदाहरण:

use sqlx::query;

let query = sqlx::query("SELECT * FROM users WHERE id = $1 AND active = $2")
    .bind(1)
    .bind(true);

2. .bind()

यह क्या करता है: क्वेरी पैरामीटर में एक मान बाइंड करता है। कॉल का क्रम SQL में प्लेसहोल्डर के क्रम के अनुरूप होता है।

पैरामीटर:

  • value: impl Encode + Type<DB> — कोई भी मान जिसे DB के लिए एन्कोड किया जा सकता है (i32, String, bool, Option, आदि)

उदाहरण:

let user_id: i32 = 42;
let user_name: &str = "Alice";

sqlx::query("INSERT INTO users (id, name) VALUES ($1, $2)")
    .bind(user_id)
    .bind(user_name)
    .execute(&pool)
    .await?;

3. .fetch_one()

यह क्या करता है: एक पंक्ति लाता है और यदि कोई पंक्ति नहीं है या एक से अधिक पंक्तियाँ हैं तो एरर देता है।

पैरामीटर:

  • executor: impl Executor — डेटाबेस कनेक्शन या पूल

उदाहरण:

let user: (i32, String) = sqlx::query_as("SELECT id, name FROM users WHERE id = $1")
    .bind(1)
    .fetch_one(&pool)
    .await?;

4. .fetch_all()

यह क्या करता है: क्वेरी से सभी पंक्तियाँ लाता है और एक Vec में लौटाता है।

उदाहरण:

let users: Vec<(i32, String)> = sqlx::query_as("SELECT id, name FROM users")
    .fetch_all(&pool)
    .await?;

5. .execute()

यह क्या करता है: क्वेरी निष्पादित करता है और प्रभावित पंक्तियों की संख्या लौटाता है। INSERT, UPDATE, DELETE के लिए उपयोगी।

उदाहरण:

let result = sqlx::query("UPDATE users SET name = $1 WHERE id = $2")
    .bind("Bob")
    .bind(1)
    .execute(&pool)
    .await?;

println!("{} पंक्तियाँ अपडेट की गईं", result.rows_affected());

6. sqlx::query_as

यह क्या करता है: एक क्वेरी बनाता है जो परिणामों को एक विशिष्ट Rust प्रकार में मैप करता है।

पैरामीटर:

  • sql: &str — SQL क्वेरी
  • प्रकार T: for<'r> FromRow<'r, DB::Row> — वह प्रकार जिसमें परिणाम मैप किए जाएंगे

उदाहरण:

#[derive(sqlx::FromRow)]
struct User {
    id: i32,
    name: String,
    email: String,
}

let user: User = sqlx::query_as::<_, User>("SELECT id, name, email FROM users WHERE id = $1")
    .bind(1)
    .fetch_one(&pool)
    .await?;

निष्कर्ष

SQLx Rust डेवलपर्स के लिए एक शक्तिशाली और लचीला डेटाबेस टूल है। यह टाइप सुरक्षा, एसिंक्रोनस सपोर्ट और SQL पर पूर्ण नियंत्रण प्रदान करता है। चाहे आप PostgreSQL, MySQL, SQLite या MSSQL के साथ काम कर रहे हों, SQLx आपके प्रोजेक्ट के लिए एक उत्कृष्ट विकल्प है।

अनुशंसाएँ