परिचय: C++ डेवलपर को डेटाबेस की आवश्यकता क्यों?
\nC++ सबसे शक्तिशाली सिस्टम प्रोग्रामिंग भाषाओं में से एक है। हालाँकि, उच्च-लोड वाली परियोजनाओं में भी डेटा को सहेजे बिना काम चलाना मुश्किल होता है। चाहे वह गेम सर्वर हो, वित्तीय एप्लिकेशन हो या IoT सिस्टम — आपको एक विश्वसनीय भंडारण की आवश्यकता होगी। इस लेख में हम दो लोकप्रिय दृष्टिकोणों पर चर्चा करेंगे: रिलेशनल DBMS PostgreSQL और डॉक्यूमेंट-ओरिएंटेड MongoDB। आप सीखेंगे कि उन्हें C++ प्रोजेक्ट से कैसे जोड़ा जाए, बुनियादी संचालन कैसे किए जाएँ और सामान्य गलतियों से कैसे बचा जाए।
\n\n1. C++ में PostgreSQL: रिलेशनल DB का क्लासिक
\nPostgreSQL एक परिपक्व, विश्वसनीय DBMS है जिसमें ट्रांज़ैक्शन और जटिल क्वेरी के लिए उत्कृष्ट समर्थन है। C++ से इसके साथ काम करने के लिए, अक्सर libpqxx लाइब्रेरी का उपयोग किया जाता है — जो libpq के ऊपर एक आधिकारिक C++ रैपर है।
स्थापना और कनेक्शन
\nपैकेज मैनेजर के माध्यम से libpqxx स्थापित करें या स्रोत से बनाएँ:
# Ubuntu/Debian\nsudo apt-get install libpqxx-dev\n\n# macOS (Homebrew)\nbrew install libpqxx\nCMakeLists.txt में जोड़ें:
\nfind_package(PQXX REQUIRED)\ntarget_link_libraries(your_project pqxx::pqxx)\n\nडेटाबेस से कनेक्शन और सरल SELECT
\nआइए एक न्यूनतम उदाहरण देखें — उपयोगकर्ताओं की सूची प्राप्त करना:
\n#include <iostream>\n#include <pqxx/pqxx>\n\nint main() {\n try {\n // कनेक्शन स्ट्रिंग: "host=... dbname=... user=... password=..."\n pqxx::connection conn("host=localhost dbname=testdb user=admin password=secret");\n pqxx::work txn(conn);\n\n // क्वेरी निष्पादित करें\n pqxx::result result = txn.exec("SELECT id, name, email FROM users LIMIT 10");\n\n for (auto row : result) {\n std::cout << "ID: " << row[0].as<int>()\n << ", Name: " << row[1].as<std::string>()\n << ", Email: " << row[2].as<std::string>() << std::endl;\n }\n\n txn.commit(); // ट्रांज़ैक्शन समाप्त करें\n } catch (const std::exception &e) {\n std::cerr << "त्रुटि: " << e.what() << std::endl;\n return 1;\n }\n return 0;\n}\nध्यान दें: सभी संचालन try-catch ब्लॉक में लपेटे गए हैं — libpqxx किसी भी विफलता पर अपवाद उत्पन्न करता है।
पैरामीटरीकृत क्वेरी (सुरक्षा)
\nमानों को प्रतिस्थापित करने के लिए स्ट्रिंग को कभी भी संयोजित न करें — यह SQL इंजेक्शन का रास्ता खोलता है। तैयार अभिव्यक्तियों का उपयोग करें:
\npqxx::work txn(conn);\n// तैयारी\nconn.prepare("insert_user", "INSERT INTO users (name, email) VALUES ($1, $2)");\n\n// पैरामीटर के साथ निष्पादन\ntxn.exec_prepared("insert_user", "इवान पेत्रोव", "ivan@example.com");\ntxn.commit();\n\n2. C++ में MongoDB: NoSQL का लचीलापन
\nMongoDB डेटा को BSON (बाइनरी JSON) प्रारूप में संग्रहीत करता है और उन कार्यों के लिए उपयुक्त है जहाँ डेटा स्कीमा बदल सकता है। C++ के लिए आधिकारिक ड्राइवर mongocxx है (mongoc के ऊपर)।
mongocxx ड्राइवर की स्थापना
\nस्रोत से बनाना सबसे विश्वसनीय तरीका है। संक्षिप्त निर्देश:
\n# निर्भरताएँ स्थापित करें: libmongoc, libbson, cmake\ngit clone https://github.com/mongodb/mongo-cxx-driver.git\ncd mongo-cxx-driver/build\ncmake .. -DCMAKE_BUILD_TYPE=Release -DBSONCXX_POLY_USE_MNMLSTC=ON\nmake -j4\nsudo make install\nCMakeLists.txt में:
\nfind_package(libmongocxx REQUIRED)\ntarget_link_libraries(your_project mongocxx::mongocxx)\n\nकनेक्शन और दस्तावेज़ सम्मिलन
\n#include <iostream>\n#include <bsoncxx/json.hpp>\n#include <mongocxx/client.hpp>\n#include <mongocxx/instance.hpp>\n#include <mongocxx/uri.hpp>\n\nint main() {\n // ड्राइवर आरंभीकरण (प्रति एप्लिकेशन एक बार)\n mongocxx::instance inst{};\n\n // कनेक्शन URI\n mongocxx::uri uri("mongodb://localhost:27017");\n mongocxx::client client(uri);\n\n // डेटाबेस और संग्रह प्राप्त करें\n auto db = client["testdb"];\n auto collection = db["users"];\n\n // एक दस्तावेज़ बनाएँ\n bsoncxx::builder::stream::document document{};\n document << "name" << "अन्ना स्मिर्नोवा"\n << "email" << "anna@example.com"\n << "age" << 28;\n\n // दस्तावेज़ सम्मिलित करें\n auto result = collection.insert_one(document.view());\n std::cout << "सम्मिलित दस्तावेज़ ID: " << result->inserted_id().get_oid().value.to_string() << std::endl;\n\n return 0;\n}