Rust के लिए ORM: पूर्ण तुलना और उपयोग के उदाहरण
Rust पारिस्थितिकी तंत्र डेटाबेस के साथ काम करने के लिए कई शक्तिशाली समाधान प्रदान करता है। इस लेख में हम तीन मुख्य दृष्टिकोणों की विस्तार से तुलना करेंगे: Diesel (सिंक्रोनस, कंपाइल करने योग्य ORM), SeaORM (एसिंक्रोनस, लचीला) और SQLx (न्यूनतम, कंपाइलेशन के समय क्वेरी की जांच के साथ)। आप जानेंगे कि विशिष्ट कार्यों के लिए कौन सा उपकरण चुनना है, और कार्यशील कोड उदाहरण देखेंगे।
1. Diesel — सिद्ध सिंक्रोनस ORM
Diesel Rust के लिए सबसे परिपक्व ORM है। इसकी मुख्य विशेषता है — कंपाइलेशन के समय टाइप सुरक्षा। सभी SQL क्वेरी बिल्ड के दौरान जांची जाती हैं, जो त्रुटियों के एक पूरे वर्ग को समाप्त करती हैं। यह केवल सिंक्रोनस रूप से काम करता है, लेकिन tokio के साथ कनेक्शन पूल का आयोजन किया जा सकता है।
Diesel के उपयोग का उदाहरण:
// models.rs#[derive(Queryable, Insertable)]#[table_name = "users"]pub struct User { pub id: i32, pub name: String, pub email: String,}
// main.rsuse diesel::prelude::*;use diesel::dsl::insert_into;
fn main() { let conn = PgConnection::establish("postgres://user:pass@localhost/db") .expect("Database connection failed");
let new_user = User { id: 0, name: "Alice".into(), email: "alice@example.com".into(), };
let inserted = insert_into(users::table) .values(&new_user) .get_result::<User>(&conn) .expect("Insert failed");
println!("Created user: {}", inserted.name);}लाभ: अधिकतम प्रदर्शन, सख्त टाइपिंग, अंतर्निहित माइग्रेशन।
नुकसान: सिंक्रोनस, जटिल सेटअप, बॉक्स से बाहर async का समर्थन नहीं करता।
2. SeaORM — एसिंक्रोनस और लचीला
SeaORM एक आधुनिक एसिंक्रोनस ORM है, जो sqlx पर बनाया गया है। यह tokio और async-std का समर्थन करता है। यह CRUD, संबंधों (एक-से-एक, एक-से-अनेक) और माइग्रेशन के लिए एक समृद्ध API प्रदान करता है। Actix या Axum पर वेब एप्लिकेशन के लिए आदर्श।
SeaORM के साथ उदाहरण:
use sea_orm::*;use sea_orm::entity::prelude::*;
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]#[sea_orm(table_name = "users")]pub struct Model { #[sea_orm(primary_key)] pub id: i32, pub name: String, pub email: String,}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]pub enum Relation {}
impl ActiveModelBehavior for ActiveModel {}
// उपयोगasync fn create_user(db: &DatabaseConnection) -> Result<(), DbErr> { let user = ActiveModel { name: Set("Bob".to_owned()), email: Set("bob@example.com".to_owned()), ..Default::default() }; let result = user.insert(db).await?; println!("User created with id: {}", result.id); Ok(())}लाभ: पूर्ण async, PostgreSQL, MySQL, SQLite का समर्थन, सरल माइग्रेशन।
नुकसान: सिंथेटिक परीक्षणों में Diesel से धीमा, अधिक निर्भरताएं।
3. SQLx — हल्का और सुरक्षित
SQLx शास्त्रीय अर्थों में ORM नहीं है, बल्कि एक एसिंक्रोनस SQL ड्राइवर है जो कंपाइलेशन के समय क्वेरी की जांच करता है। आप शुद्ध SQL लिखते हैं, और SQLx इसके सिंटैक्स और आर्गुमेंट के प्रकारों की जांच करता है। यह PostgreSQL, MySQL, SQLite का समर्थन करता है। यदि आप क्वेरी पर पूर्ण नियंत्रण पसंद करते हैं तो यह एक उत्कृष्ट विकल्प है।
SQLx का उदाहरण:
use sqlx::postgres::PgPool;
#[derive(sqlx::FromRow)]struct User { id: i32, name: String, email: String,}
#[tokio::main]async fn main() -> Result<(), sqlx::Error> { let pool = PgPool::connect("postgres://user:pass@localhost/db").await?;
let user = sqlx::query_as::<_, User>( "SELECT id, name, email FROM users WHERE email = $1"