MariaDB Connector - evtl. auch eine Frage des Toolings



  • Moin!
    Verzweifelt suche ich eine Möglichkeit, mit möglichst einfachen Mitteln zu einer SQL-Datenbank zu verbinden. An PostgreSQL bin ich zunächst leider gescheitert - als Admin ist mir das die Liebste DB. Für den offiziellen Postgre Connector "pqxx" braucht es wohl definitiv handfeste cmake-Kenntnisse. MySQL finde ich doof, weil es da seit vielen Jahren nur 32-Bit Binary-Windows-Installer gibt. Also MariaDB! Das Komplettpaket installiert und auch den C++ Connector geladen und installiert (https://mariadb.com/docs/ent/connect/programming-languages/cpp/install/)
    Den Pfad wie in der Anleitung beschrieben noch in der System-PATH-Variable hinterlegt ("C:\Program Files\MariaDB\MariaDB C++ Connector 64-bit")
    Packe ich nun die Inhalte dieses Verzeichnis in das Verzeichnis, in dem ich meine Applikation entwickeln möchte, kann ich mittels eines

    #include "mariadb/conncpp.hpp"
    

    die Haupt-Headerdatei inkludieren.
    Dadurch wird die Klasse "SQL" auch direkt verfügbar und ich kann Code wie z.B.

        // Instantiate Driver
        sql::Driver *driver = sql::mariadb::get_driver_instance();
    
        // Configure Connection
        sql::SQLString url("jdbc:mariadb://localhost:3306/todo");
        sql::Properties properties({{"user", "app_user"}, {"password", "Password123!"}});
    
        // Establish Connection
        std::unique_ptr<sql::Connection> conn(driver->connect(url, properties));
    

    schreiben (Code kommt direkt aus dem offiziellen How To von MariaDB). Jedoch bekomme ich dann beim Kompilieren mit gcc 11.3, aktiviertem C++ 17 in VS Code unter Windows 11 verschiedenste Fehler:

    include/mariadb/conncpp/Types.hpp:49:5: Fehler: expected identifier before numeric constant
       49 |     _NULL,
          |     ^~~~~
    include/mariadb/conncpp/Types.hpp:49:5: Fehler: expected »}« before numeric constant
    In Datei, eingebunden von include/mariadb/conncpp.hpp:36,
                     von main.cpp:2:
    include/mariadb/conncpp/Types.hpp:27:14: Anmerkung: andere Fundstelle von »{« ist hier
       27 |   enum Types {
          |              ^
    In Datei, eingebunden von /usr/include/wchar.h:6,
                     von /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/cwchar:44,
                     von /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/bits/postypes.h:40,
                     von /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/iosfwd:40,
                     von /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/ios:38,
                     von /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/ostream:38,
                     von /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/iostream:39,
                     von main.cpp:1:
    include/mariadb/conncpp/Types.hpp:49:5: Fehler: expected unqualified-id before numeric constant
       49 |     _NULL,
          |     ^~~~~
    In Datei, eingebunden von include/mariadb/conncpp.hpp:36,
                     von main.cpp:2:
    include/mariadb/conncpp/Types.hpp:70:16: Fehler: Verwendung des enum »Types« ohne vorherige Deklaration
       70 |   typedef enum Types DataType;
          |                ^~~~~
    include/mariadb/conncpp/Types.hpp:71:1: Fehler: expected declaration before »}« token
       71 | }
          | ^
    

    Ich gehe mal ganz stark davon aus, dass das keine Fehler im offiziellen Source-Code sind, sondern dass ich irgendwas falsch mache. Darf ich nicht einfach das Verzeichnis kopieren? Muss ich doch irgendwas mit make / cmake machen?

    Zusatzfrage: Ich empfinde dieses ganze Tooling-Thema mit git, gcc, make, cmake usw. deutlich komplizierter als C++ selber. Aber irgendwann muss ich da ran, wie / wo lerne ich das am besten? Externe Libraries einbinden soll nicht für immer ein Buch mit 123 Siegeln bleiben.

    Grüße



  • Die Fehlermeldung lässt mich vermuten dass _NULL irgendwo als Makro definiert ist, vermutlich mit dem Wert 0. Das beisst sich dann mit der Verwendung im conncpp Header File.

    Kompilieren mit gcc 11.3, aktiviertem C++ 17 in VS Code unter Windows 11

    OK. Gibt es einen Grund warum du nicht Visual Studio oder zumindest den Visual Studio Compiler verwendest? (Geht auch mit CMake und wenn du willst kannst du auch weiterhin VS Code als Editor/IDE verwenden.)

    An PostgreSQL bin ich zunächst leider gescheitert - als Admin ist mir das die Liebste DB. Für den offiziellen Postgre Connector "pqxx" braucht es wohl definitiv handfeste cmake-Kenntnisse.

    Ich würde an deiner Stelle versuchen pqxx oder eine andere PostgreSQL Library zum Laufen zu bekommen. Oder auch etwas womit du nicht an eine DB gebunden bist. Vielleicht einen ODBC Wrapper ala nanodbc?



  • @hustbaer sagte in MariaDB Connector - evtl. auch eine Frage des Toolings:

    OK. Gibt es einen Grund warum du nicht Visual Studio oder zumindest den Visual Studio Compiler verwendest? (Geht auch mit CMake und wenn du willst kannst du auch weiterhin VS Code als Editor/IDE verwenden.)

    Ich habe C++ halt mit der Kombi VS Code + gcc (über cygwin) gelernt. Grundsätzlich habe ich aber auch Visual Studio installiert. Ich schaue sonst mal, ob ich damit vielleicht weiterkomme - da kann ich ja auch die Includes und Libs per Klick einbinden.

    @hustbaer sagte in MariaDB Connector - evtl. auch eine Frage des Toolings:

    Ich würde an deiner Stelle versuchen pqxx oder eine andere PostgreSQL Library zum Laufen zu bekommen. Oder auch etwas womit du nicht an eine DB gebunden bist. Vielleicht einen ODBC Wrapper ala nanodbc?

    Ja, pqxx wäre mir am liebsten - hier brauche ich eine leicht verständliche Anleitung / Einführung in cmake bzw. wie man halt externe Libraries richtig einbindet. nanodbc müsste ich mir anschauen.



  • Hab das hier gefunden
    https://github.com/GordonLElliott/Easy-PQXX-Build-for-Windows-Visual-Studio

    Zum einen erklärt es am anfang der Readme.md wie man pqxx mit cmake baut und später geht es auf die batch files ein, welche den Process etwas vereinfachen sollen.
    Wobei das ganze repository 3 Jahre alt ist. Zu mindestens die cmake Erklärung sollte noch relativ aktuell sein auch wenn dort von pqxx 7.0 die rede ist.



  • Ich kann https://github.com/rbock/sqlpp11 empfehlen. Nutze ich auch selber. Die Main sellings points sind:

    • Einfach zu verwenden mit cmake
    • SQL Expressions in C++ schreiben mit Compiler Support
    • Datenbank unabhängig, einige Datenbanken werden bereits unterstützt, mehr können hinzugefügt werden

    Zufälligerweise gibt es dort auch ein kleines Beispiel wie man das ganze mit CMake nutzt:
    https://github.com/rbock/sqlpp11/tree/main/examples/usage_fetch_content

    Da ich den CMake Support für die Library & die Beispiele geschrieben habe, kann ich dir da auch ganz gut Hilfestellung geben.

    Zu deiner Frage allgemein mit dem Tooling. Der erste Schritt sollte sein welches Tools es gibt und welche Probleme die lösen. Die von dir genannten Tools machen nämlich tatsächlich alle unterschiedliche Aufgaben und entsprechend ergibt es auch nur so mittelmäßig Sinn die jetzt mit einem Buch / Tutorial etc. alle auf einmal zu lernen.

    Hier mal ein Versuch der Erklärung:

    • Git: Dient zur Versionsverwaltung von Source Code. Sprachenübergreifend kannst du damit auch andere Projekte mit git submodules einbinden. Git übernimmt aber hier nur den Teil wie der Source Code von der Lib A in dein Projekt B reinkommt. Wie Projekt B dann die Lib A verwendet ist ne andere Sache, die nix mehr mit git zu tun hat. Ob Git Submodules Sinn machen hängt vom Anwendungsfall ab. Ich nutze die häufig, wenn Lib A auch von mir stammt. Dann kann ich parallel an Projekt B und Lib A arbeiten 🙂 Meine Empfehlung ist Git mit der Command Line zu lernen und VS Code o.ä. als Unterstützung für Merging etc. Gibt hier sogar ein kostenloses Buch für https://git-scm.com/book/de/v2
    • gcc: Das is ein Compiler, um C++ Code zu kompilieren. Es gibt auch noch Clang oder MSVC und weitere . Den kannst du händisch aufrufen und das würde ich dir auch mal empfehlen zu tun. Im allgemeinen ist das aber sehr anstrengend große Projekte komplett von Hand zu kompilieren und man nutzt dafür Tools.
    • make: Ist ein Buil Tool / System. Damit kannst du Kommandos in Abgängigkeit von Bedingungen ausführen. Grundsätzlich kann man das für alle möglichen Aufgaben nutzen und nicht nur für C++ kompilieren. Du kannst z.b. ein einfaches Makefile schreiben, um die Schritte die du vorher mit gcc von Hand für jede Datei ausgeführt hast, automatisch durchführen zu lassen. Make kann man lernen, wenn man Lust drauf hat. Ist schon manchmal nützlich. Aber Makefiles selber schreiben zum kompilieren von seinen C++ Projekten ist nicht mehr so richtig zeitgemäß. Ich würde mir die Zeit erstmal sparen das zu lernen oder wirklich mal nur 30min verwenden, um nen simples Projekt zu kompilieren, einfach um es mal gesehen zu haben. Es gibt auch hier wieder einige Alternativen zu Make. Zum Beispiel Ninja.
    • cmake: Das ist ein Build System Generator 🙂 Jetzt wird es kompliziert ich weiß. Die Idee ist nochmal auf einer deutlich höheren Abstraktionsebene zu arbeiten. Z.B. weg zu abstrahieren, ob man grade auf Windows oder Linux etc. ist. CMake generiert für dich die Build Tool Dateien und führt diese im Hintergrund aus. Zum Beispiel kann CMake also erkennen: Ah du bist auf Linux und hast einen GCC Compiler. Dann erstellt es dir ein bzw. mehrere Makefiles, um deinen Code mit gcc zu kompilieren.

    Okay soweit so gut. Hier also was du wirklich brauchst.

    • Git => Das Standard Werkzeug zur Versionsveraltung von Source Code. Sollte man auf jeden Fall beherschen allgemein.
    • Basics über Kompilierung von C++, Linking, Libraries etc. auf eher low level ebene. Daher du solltest wissen wie funktioniert eig. das Kompilieren und Linken von C++ Applikationen. Unterschied Dynamische und Static Libraries. Unterschiede zwischen Windows, Linux und Mac Os. Wie werden Libraries auf Compiler / Linker Ebene einbezogen? => Das wirst du niemals selber machen in großen Projekten, sondern das macht alles CMake. Aber wenn du nicht weißt wie das unter der Haube grob abläuft, wirst du CMake auch nicht kapieren. Dafür hilft es wirklich mal ein kleines einfaches Testprojekt aufzusetzen mit 2-3 Source und Header Dateien, einer kleineren Lib die auf dem System schon installiert ist und das wirklich von Hand alles mal zu kompilieren und zu linken.
    • CMake!

    CMake mit Libraries zu erklären kann ich auch machen. Aber ich bin mir nicht ganz sicher wie dein kenntnisstand hier mit Libraries allgemein ist. Da müsstest du vlt. etwas konkreter nochmal werden, damit die Erklärungen auch zu deinem Wissensstand passen.



  • Bevor ich morgen nochmal was zu den anderen, ebenfalls hilfreichen Kommentaren schreibe: vielen, vielen Dank an @hustbaer für den Tipp mit nanodbc! Eine wirklich sehr schmale Bibliothek, die ich dann aber problemlos mit Visual Studio schnell einsetzen konnte. Ich habe dazu zwei kleine Videos geschaut:
    https://www.youtube.com/watch?v=oi9R0LOxInw
    https://www.youtube.com/watch?v=P7X0VTso7Jk
    Das hat auf Anhieb funktioniert und ich kann endlich Datenbanken ansprechen! Heute morgen klappte das wunderbar mit MariaDB (und dem passenden ODBC-Treiber). Morgen probiere es mal mit dem PostgreSQL-ODBC-Treiber
    https://www.postgresql.org/ftp/odbc/versions/msi/

    Vielen Dank!



  • @thuering
    Noch ein kleiner Tip: falls die Chance besteht dass du für dein Projekt "bulk insert" und/oder "bulk update" brauchst, probier gleich am Anfang aus ob die DB Client Library das in Kombination mit dem Server der Wahl kann. Manche können es nicht, und wenn man da erst draufkommt nachdem man viel Code geschrieben hat ... dann ist das doof 🙂

    Ich hab' mal viele viele Stunden in Suchen nach Workarounds investiert, nachdem der Need für bulk Operationen bei uns entstanden ist - und wir dann feststellen mussten dass ADODB das einfach nicht unterstützt. Unsere alte SQL Server Version konnte auch noch keine Bulk Operationen per SQL-String. Und 100k Zeilen einzeln einfügen/updaten war sehr langsam. Also so ca. Faktor 100~1000 langsamer als mit bulk ops.

    Im Endeffekt konnte ich einen Workaround finden. Aber die Zeit die dabei drauf ging... pfuh. Ich glaub ich bin da in Summe mehr als ne Woche dran gesessen.



  • @firefly sagte in MariaDB Connector - evtl. auch eine Frage des Toolings:

    Hab das hier gefunden
    https://github.com/GordonLElliott/Easy-PQXX-Build-for-Windows-Visual-Studio

    Ich muss sagen, dass das nun auch nicht unbedingt ganz so kompakt und simpel ist, wie ich es gerne hätte 😅
    Ich habe mich aber dazu entschlossen, nochmal in Sachen Bildung im Bereich cmake zu investieren. Ich schaue mal...

    @Leon0402 sagte in MariaDB Connector - evtl. auch eine Frage des Toolings:

    Zufälligerweise gibt es dort auch ein kleines Beispiel wie man das ganze mit CMake nutzt:
    https://github.com/rbock/sqlpp11/tree/main/examples/usage_fetch_content

    Da ich den CMake Support für die Library & die Beispiele geschrieben habe, kann ich dir da auch ganz gut Hilfestellung geben.

    Darauf komme ich eventuell zurück!
    Was Git, cmake, make, gcc usw so grob machen und können, weiß ich bereits oder glaube zumindest, es zu wissen. Nur wie das ganze teilweise ineinander greift oder im einzelnen zu bedienen ist, ist mir in den allermeisten Fällen noch nicht klar.

    @hustbaer sagte in MariaDB Connector - evtl. auch eine Frage des Toolings:

    @thuering
    Noch ein kleiner Tip: falls die Chance besteht dass du für dein Projekt "bulk insert" und/oder "bulk update" brauchst

    Das ist nicht der Fall, als Projekt schreibe ich natürlich - wie sollte es anders sein - an einem textbasierten, rundenbasierten, klassischen RPG. In die Datenbank kommen also nur Monster, Charaktere, usw... 🤣 😜



  • @thuering sagte in [MariaDB Connector - evtl. auch eine Frage des Toolings](/forum

    @hustbaer sagte in MariaDB Connector - evtl. auch eine Frage des Toolings:

    @thuering
    Noch ein kleiner Tip: falls die Chance besteht dass du für dein Projekt "bulk insert" und/oder "bulk update" brauchst

    Das ist nicht der Fall, als Projekt schreibe ich natürlich - wie sollte es anders sein - an einem textbasierten, rundenbasierten, klassischen RPG. In die Datenbank kommen also nur Monster, Charaktere, usw... 🤣 😜

    Hm. Dann würde ich dir empfehlen dir mal SQLite anzusehen. Bzw. frage ich mich wieso man da überhaupt ne Datenbank verwenden wollen würde.