Rust के लिए ORM: तुलना और उदाहरण
Rust पारिस्थितिकी तंत्र डेटाबेस के साथ काम करने के लिए कई शक्तिशाली समाधान प्रदान करता है। इस लेख में हम तीन लोकप्रिय ORM-जैसे उपकरणों की तुलना करेंगे: Diesel, SeaORM और SQLx। इनमें से प्रत्येक का अपना दर्शन और उपयोग का क्षेत्र है। हम उनकी विशेषताओं, प्रदर्शन पर चर्चा करेंगे और व्यावहारिक उदाहरण प्रस्तुत करेंगे।
1. Diesel — टाइप सुरक्षा के साथ क्लासिक ORM
Diesel Rust के लिए सबसे परिपक्व ORM है, जो "कंपाइल टाइम पर टाइप सुरक्षा" के सिद्धांत पर बनाया गया है। इसे माइग्रेशन के माध्यम से स्कीमा के स्पष्ट विवरण की आवश्यकता होती है और यह सख्ती से टाइप की गई संरचनाएँ उत्पन्न करता है।
विशेषताएँ:
- कंपाइलेशन क्वेरी की शुद्धता की जाँच करता है (SQL त्रुटियाँ — बिल्ड चरण पर)
- PostgreSQL, MySQL, SQLite के लिए समर्थन
- सिंक्रोनस इंजन (एसिंक्रोनस के लिए
diesel-asyncआवश्यक) - क्वेरी बनाने के लिए स्वयं का DSL
कोड उदाहरण (Diesel + PostgreSQL):
// models.rsuse diesel::prelude::*;
#[derive(Queryable, Selectable)]#[diesel(table_name = crate::schema::users)]#[diesel(check_for_backend(diesel::pg::Pg))]pub struct User { pub id: i32, pub name: String, pub email: String,}
// main.rsuse diesel::prelude::*;use diesel::pg::PgConnection;
fn get_user(conn: &mut PgConnection, user_id: i32) -> Option<User> { use crate::schema::users::dsl::*; users.filter(id.eq(user_id)) .first::<User>(conn) .ok()}कब चुनें: उन परियोजनाओं के लिए जहाँ कंपाइल चरण पर क्वेरी सुरक्षा महत्वपूर्ण है, और आप सख्त स्कीमा के लिए तैयार हैं।
2. SeaORM — ActiveRecord दृष्टिकोण के साथ एसिंक्रोनस ORM
SeaORM एक आधुनिक एसिंक्रोनस ORM है, जो Ruby on Rails से प्रेरित है। यह कोड-फर्स्ट और मौजूदा DB से संस्थाओं के निर्माण दोनों का समर्थन करता है।
विशेषताएँ:
- पूर्ण एसिंक्रोनसता (Tokio, async-std)
- PostgreSQL, MySQL, SQLite, और CockroachDB के लिए समर्थन
- माइग्रेशन, संबंध (has_many, belongs_to), पेजिनेशन
- कोड जनरेटर
sea-orm-cli
कोड उदाहरण (SeaORM + PostgreSQL):
use sea_orm::*;use entity::user;
async fn find_user(db: &DatabaseConnection, user_id: i32) -> Result<Option<user::Model>, DbErr> { user::Entity::find_by_id(user_id) .one(db) .await}
// उपयोगasync fn example() { let db = Database::connect("postgres://user:pass@localhost/db").await.unwrap(); if let Some(user) = find_user(&db, 42).await.unwrap() { println!("User: {} ({})", user.name, user.email); }}कब चुनें: एसिंक्रोनस वेब एप्लिकेशन (Actix, Axum) के लिए, जहाँ सक्रिय विकास और "बॉक्स से बाहर" समृद्ध कार्यक्षमता की आवश्यकता है।
3. SQLx — अधिकतम लचीलेपन के साथ "लगभग ORM"
SQLx पूरी तरह से ORM नहीं है, बल्कि क्वेरी जाँच के साथ एक एसिंक्रोनस SQL क्लाइंट है। यह आपको शुद्ध SQL लिखने की अनुमति देता है, लेकिन कंपाइल चरण पर इसकी शुद्धता की जाँच करता है।
विशेषताएँ:
- कंपाइल टाइम पर क्वेरी जाँच (मैक्रो
sqlx::query!के माध्यम से) - पूर्ण एसिंक्रोनसता
- PostgreSQL, MySQL, SQLite, MSSQL के लिए समर्थन
- JSON, माइग्रेशन, कनेक्शन पूल के लिए समर्थन
कोड उदाहरण (SQLx + PostgreSQL):
use sqlx::PgPool;
#[derive(sqlx::FromRow)]struct User { id: i32, name: String, email: String,}
async fn get_user(pool: &PgPool, user_id: i32) -> Result<Option<User>, sqlx::Error> { sqlx::query_as::<_, User>("SELECT id, name, email FROM users WHERE id = $1") .bind(user_id) .fetch_optional(pool) .await}कब चुनें: यदि आप SQL लिखना पसंद करते हैं