C++ के लिए ORM: तुलना और उपयोग के उदाहरण (ODB, SOCI, SQLiteCpp)

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

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

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

C++ के लिए ORM: तुलना और उपयोग के उदाहरण

\n\n

डायनामिक टाइपिंग वाली भाषाओं (Python, PHP) के विपरीत, C++ में "मैजिकल" ORM बनाने के लिए पर्याप्त रिफ्लेक्शन और मेटाप्रोग्रामिंग का अंतर्निहित समर्थन नहीं है। फिर भी, कई शक्तिशाली समाधान मौजूद हैं जो डेटाबेस के साथ काम को स्वचालित करते हैं। इस लेख में, हम तीन लोकप्रिय लाइब्रेरीज़: ODB, SOCI और SQLiteCpp की तुलना करेंगे, और उनके उपयोग के उदाहरण देंगे।

\n\n

तुलना के मानदंड

\n

C++ के लिए ORM चुनते समय, निम्नलिखित पर ध्यान देना चाहिए:

\n
    \n
  • कोड जनरेशन का प्रकार — बाहरी जनरेटर या C++ टेम्पलेट्स।
  • \n
  • डेटाबेस सपोर्ट — SQLite, PostgreSQL, MySQL, Oracle।
  • \n
  • प्रदर्शन — मैपिंग पर ओवरहेड।
  • \n
  • एकीकरण की जटिलता — क्या एक अलग बिल्ड स्टेप की आवश्यकता है।
  • \n
\n\n

1. ODB — C++ के लिए औद्योगिक ORM

\n

ODB एक व्यावसायिक (ओपन-सोर्स के लिए मुफ्त संस्करण के साथ) ORM है, जो एनोटेटेड हेडर फ़ाइलों से कोड जनरेशन पर आधारित है। यह रिलेशनल डेटाबेस (SQLite, PostgreSQL, MySQL, Oracle) और यहां तक कि NoSQL (MongoDB) का समर्थन करता है।

\n\n

ODB के साथ उदाहरण (SQLite)

\n

पहले एंटिटी क्लास घोषित करें:

\n
#include <odb/core.hxx>\n\n#pragma db object\nclass Person {\npublic:\n    Person(const std::string& name, int age)\n        : name_(name), age_(age) {}\n\n    unsigned long id() const { return id_; }\n    const std::string& name() const { return name_; }\n    int age() const { return age_; }\n\nprivate:\n    friend class odb::access;\n    #pragma db id auto\n    unsigned long id_;\n    std::string name_;\n    int age_;\n};
\n\n

उपयोग:

\n
#include <odb/database.hxx>\n#include <odb/sqlite/database.hxx>\n#include <odb/transaction.hxx>\n#include "person.hxx"\n#include "person-odb.hxx"\n\nint main() {\n    auto db = std::make_shared<odb::sqlite::database>("test.db");\n    odb::transaction t(db->begin());\n\n    Person p("Alice", 30);\n    db->persist(p); // INSERT\n\n    auto result = db->query<Person>(\n        odb::query<Person>::age > 25);\n    for (const auto& person : result) {\n        std::cout << person.name() << std::endl;\n    }\n    t.commit();\n}
\n\n

लाभ: पूर्ण ऑब्जेक्ट मॉडल, संबंधों का समर्थन, आलसी लोडिंग। नुकसान: कोड जनरेटर की आवश्यकता (बिल्ड स्टेप), व्यावसायिक उपयोग के लिए लाइसेंस।

\n\n

2. SOCI — हल्का "डेटा एक्सेस लेयर"

\n

SOCI एक पूर्ण ORM नहीं है, बल्कि C++ से SQL के साथ काम करने के लिए एक लाइब्रेरी है, जो क्वेरी निष्पादित करने और परिणामों को मैप करने के लिए सुविधाजनक सिंटैक्स प्रदान करती है। यह SQLite, PostgreSQL, MySQL, Oracle और ODBC के साथ काम करती है।

\n\n

SOCI के साथ उदाहरण

\n
#include <soci/soci.h>\n#include <soci/sqlite3/soci-sqlite3.h>\n#include <iostream>\n\nstruct Person {\n    int id;\n    std::string name;\n    int age;\n};\n\nint main() {\n    soci::session sql(soci::sqlite3, "test.db");\n    sql << "CREATE TABLE IF NOT EXISTS person ("\n           "id INTEGER PRIMARY KEY, "\n           "name TEXT, age INTEGER)";\n\n    // इन्सर्ट\n    sql << "INSERT INTO person (name, age) VALUES (:name, :age)",\n        soci::use("Bob"), soci::use(25);\n\n    // स्ट्रक्चर में मैपिंग के साथ सिलेक्ट\n    Person p;\n    soci::indicator ind;\n    sql << "SELECT id, name, age FROM person WHERE id = :id",\n        soci::use(1), soci::into(p.id), soci::into(p.name, ind), soci::into(p.age);\n\n    if (ind == soci::i_ok) {\n        std::cout << p.name << " " << p.age << std::endl;\n    }\n}
\n\n

लाभ: आसान एकीकरण, कोई कोड जनरेशन नहीं, prepared statements का समर्थन। नुकसान: कोई स्वचालित ऑब्जेक्ट मैपिंग नहीं

अनुशंसाएँ