Rust के लिए ORM: विस्तृत तुलना और उपयोग के उदाहरण
\n\nRust इकोसिस्टम डेटाबेस के साथ काम करने के लिए कई शक्तिशाली समाधान प्रदान करता है। इस लेख में, हम Rust के लिए तीन सबसे लोकप्रिय ORM (Object-Relational Mapping) पर चर्चा करेंगे: Diesel, SeaORM और SQLx। इनमें से प्रत्येक की अपनी ताकत है और यह विभिन्न परिदृश्यों के लिए उपयुक्त है। हम उनकी प्रमुख विशेषताओं के आधार पर तुलना करेंगे और व्यावहारिक कोड उदाहरण प्रस्तुत करेंगे।
\n\n1. Diesel — अधिकतम प्रदर्शन के साथ क्लासिक ORM
\n\nDiesel Rust इकोसिस्टम में सबसे परिपक्व ORM है। यह सिंक्रोनस रूप से काम करता है (diesel-async के माध्यम से एसिंक्रोनस सपोर्ट के साथ) और अपने उच्च प्रदर्शन और टाइप सुरक्षा के लिए जाना जाता है।
मुख्य विशेषताएं:
\n- \n
- पूर्ण टाइप सुरक्षा: SQL त्रुटियाँ कंपाइलेशन के समय पकड़ी जाती हैं \n
- PostgreSQL, MySQL, SQLite के लिए समर्थन \n
- CLI टूल
diesel_cliके माध्यम से स्कीमा जनरेशन \n - जटिल क्वेरी और ट्रांजैक्शन के लिए अनुकूलित \n
Diesel के साथ कोड उदाहरण:
\n// मॉडल की परिभाषा\n#[derive(Queryable, Insertable)]\n#[diesel(table_name = crate::schema::users)]\nstruct User {\n id: i32,\n name: String,\n email: String,\n}\n\n// नया उपयोगकर्ता सम्मिलित करना\nfn create_user(conn: &mut PgConnection, name: &str, email: &str) -> User {\n let new_user = NewUser { name, email };\n diesel::insert_into(users::table)\n .values(&new_user)\n .get_result(conn)\n .expect("Error saving new user")\n}\n\n// सभी उपयोगकर्ताओं को क्वेरी करना\nfn get_all_users(conn: &mut PgConnection) -> Vec<User> {\n users::table\n .load::<User>(conn)\n .expect("Error loading users")\n}\n\n2. SeaORM — सक्रिय मॉडल के साथ एसिंक्रोनस ORM
\n\nSeaORM एक आधुनिक एसिंक्रोनस ORM है, जो Entity Framework और Active Record से प्रेरित है। यह क्वेरी बनाने के लिए एक सुविधाजनक API प्रदान करता है और "बॉक्स से बाहर" माइग्रेशन का समर्थन करता है।
\n\nमुख्य विशेषताएं:
\n- \n
- डिफ़ॉल्ट रूप से एसिंक्रोनस (Tokio पर आधारित) \n
- सक्रिय मॉडल: संस्थाओं पर विधियाँ कॉल की जा सकती हैं \n
- संबंधों के लिए समर्थन (has_many, belongs_to, many_to_many) \n
- अंतर्निहित माइग्रेशन और CLI उपयोगिता \n
SeaORM के साथ कोड उदाहरण:
\nuse sea_orm::{entity::prelude::*, Database, EntityTrait};\n\n// संस्था की परिभाषा\n#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]\n#[sea_orm(table_name = "users")]\npub struct Model {\n #[sea_orm(primary_key)]\n pub id: i32,\n pub name: String,\n pub email: String,\n}\n\n#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]\npub enum Relation {}\n\nimpl ActiveModelBehavior for ActiveModel {}\n\n// कोड में उपयोग\nasync fn run() {\n let db = Database::connect("postgres://user:pass@localhost/db").await.unwrap();\n \n // सम्मिलित करना\n let user = ActiveModel {\n name: Set("Alice".to_owned()),\n email: Set("alice@example.com".to_owned()),\n ..Default::default()\n };\n let result = Entity::insert(user).exec(&db).await.unwrap();\n \n // सभी को चुनना\n let users: Vec<Model> = Entity::find().all(&db).await.unwrap();\n}\n\n3. SQLx — ORM नहीं, बल्कि कंपाइलेशन-टाइम जाँच के साथ एसिंक्रोनस SQL ड्राइवर
\n\nSQLx एक मध्यवर्ती स्थिति रखता है: यह एक पूर्ण ORM नहीं है, लेकिन यह कंपाइलेशन के दौरान क्वेरी जाँच के साथ SQL के साथ काम करने के लिए शक्तिशाली उपकरण प्रदान करता है। यह उन लोगों के लिए आदर्श है जो शुद्ध SQL लिखना पसंद करते हैं, लेकिन त्रुटियों से बचना चाहते हैं।
\n\nमुख्य विशेषताएं:
\n- \n
- एसिंक्रोनस (Tokio, async-std) \n
- मैक्रो
sqlx::query!के माध्यम से कंपाइलेशन-टाइम SQL क्वेरी जाँच \n - PostgreSQL, MySQL, SQLite, MSSQL के लिए समर्थन \n
- हल्का वजन, ORM का कोई जादू नहीं \n