• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]Datenbank-Zugriff aus C++

utopos

Member
Hallo allerseits!

Ich habe mir ein kleines Projekt vorgenommen, im Rahmen dessen ich
eine Kommandozeilen-Anwendung in C++ schreiben möchte.

Nun soll das Programm u.a. Daten verwalten.
Die eleganteste Lösung wäre, dies über eine Datenbank abzubilden.
Leider weiß ich überhaupt nicht, wie ich das anfangen soll.

Die Lösung, die ich mir (mit gewiss einigen Problemen bei der Umsetzung) zutraue:
Anstelle einer Datenbank verwende ich Text-Dateien, eine für jede gedachte Datenbank-Tabelle,
Tab- oder sonstwie getrennt.

Diese Lösung hat einige offensichtliche Nachteile:
Sie ist fehleranfällig, aufwändig einzurichten, Erweiterungen der Funktionalität ziehen
einen großen Anpassungsbedarf nach sich, und vor allem:
Bequeme Funktionalitäten von Datenbanken wie die Indexierung und Überprüfungen von Eingabeformaten
müsste ich mir notdürftig selbst basteln.

Daher wäre es mir am liebsten, ich könnte eine Datenbank aufbauen
und auf diese aus meinem Programm heraus lesend, updatend und insertend darauf zugreifen.

Könnt Ihr mir einen Hinweis geben, ob es da eine Bibliothek oder einen C++-Dialekt gibt,
der mir das ermöglicht? Und welche Datenbank müsste ich dafür einrichten?
Es wäre auch gut, wenn ich zur Not direkt auf der Datenbank arbeiten könnte (ohne
mein Programm).
(Ich habe bisher ein bisschen mit Kexi und mit Sqlite experimentiert;
db43 ist bei mir installiert, aber mir ist nicht klar, wie ich darauf zugreifen kann.
Rekall habe ich nicht installiert.)

Vielen Dank für alle Eure Hinweise!

Utopos
 

abgdf

Guru
Hi,

also, als Datenbankserver kann ich MySQL empfehlen. Ham' wir ja'n ganzes Unterforum zu:

http://www.linux-club.de/viewforum.php?f=36
http://www.linux-club.de/viewtopic.php?f=36&t=49585

Richte damit erstmal Deine Datenbank ein.

Wenn Du das geschafft hast, kannst Du mit einer Google-Suche zu "c++ mysql" ganz schnell was über den C++-Zugriff erfahren (ich hab's ausprobiert).

C++ wäre mir aber VIEL zu unbequem. Wenn die Datenbankabfrage nicht unbedingt zeitkritisch ist, tut's auch Python viel einfacher, z.B.:

http://code.activestate.com/recipes/171463/
http://www.devshed.com/c/a/Python/MySQL-Connectivity-With-Python/

In den meisten Fällen reicht das.

Viele Grüße
 

whois

Ultimate Guru
abgdf schrieb:
C++ wäre mir aber VIEL zu unbequem. Wenn die Datenbankabfrage nicht unbedingt zeitkritisch ist, tut's auch Python viel einfacher,
Ich bin zwar jetzt kein Python Profi aber das ist eindeutig leichter zu realisieren. ;)
 

abgdf

Guru
Ich bin zwar jetzt kein Python Profi aber das ist eindeutig leichter zu realisieren.
Genau !

Eine andere Sache wäre noch, daß man auch Datenbankoutput mit dem "mysql"-Konsolenbefehl erzeugen kann:

http://dev.mysql.com/doc/refman/5.1/en/mysql.html

Da wird auch gezeigt, wie man ein ganzes Skript mit MySQL-Befehlen "mysql" zuleiten kann.
Man kann z.B. jede Menge Datensätze aus einem Textfile über "mysql" in eine MySQL-Datenbank leiten, bzw. eine Datenbank insgesamt per Textskript erzeugen :cool:.

So, wenn man also unbedingt C/C++ mit MySQL einsetzen will, sollte man vielleicht auch einen Blick in den Source-Code des "mysql"-Befehls werfen, denn dort ist ja bereits alles, das heißt der API-Zugriff, gelöst.

Trotzdem bliebe das für den normalen Gebrauch wie gesagt immer noch unnötig kompliziert.

Viele Grüße
 
OP
U

utopos

Member
Vielen, herzlichen Dank Euch beiden!

Das hat mir sehr viel weiter geholfen.
Noch aber ist mir einiges unklar - drum frage ich noch ein bisschen weiter.

Zunächst noch ein paar milde Nebenbedingungen: Ich möchte ...
- unter Linux arbeiten;
- ggf. die meisten Programmteile aber bei einer eventuellen Migration nach Windows wiederverwenden können,
- Keine kommerzielle Software verwenden ;-)
- eine kompilierte ausführbare Datei erstellen, die auf Eingaben eines Benutzers reagiert, dem es egal sein kann
und verborgen bleibt, in welcher Sprache das Programm geschrieben wurde.
(Ist wahrscheinlich klar, aber geht das auch in Python? Das meiste, was ich gefunden habe,
hat mit Interpreter und "interactive mode" zu tun).

Zeitkritisch ist die Anwendung bestimmt nicht; ich rechne vorerst mit ziemlich kleinen Datenbeständen.
Python hätte für mich jedoch den Nachteil, dass ich es nicht kann ... ;-)
Wo genau wird das denn bequemer als C++?

Ich habe mich bezüglich Eurer Vorschläge einmal ein bisschen schlau gemacht.
Dabei stoße ich auf folgende Fragen:

1.) mySQL scheint ja recht leicht zu behandeln zu sein.
Ich habe jedoch Probleme, eine neue Datenbank einzurichten bzw. auf eine existierende zuzugreifen.
Wenn ich
> mysql <NEUER_DB_BEZEICHNER>
oder
>mysql <PFAD_ZU_EXISTIERENDER_DB>
aufrufe, erhalte ich den Fehler

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Hat das was mit der Benutzer-/Rechteverwaltung zu tun?
Wohlgemerkt, ich möchte auf einem einzelnen Rechner alles haben, ohne Datenbank auf einem Server und so ...


2.) Wenn ich in C++ arbeiten möchte, sollte ich "mysql.h" einbinden,
wenn ich hingegen Python verwende, ist wohl entweder das Paket "csv" die richtige Adresse,
oder aber "DB-API".Mir ist völlig unklar, wie ich das auf eine selbstgestrickte DB anwende.

3.) Wie funktioniert das überhaupt mit python?
Ich tippe Quelldateien und lasse einen Kompiler drüberlaufen?
Und an welcher Stelle kommt wie die Verbindung zur DB zustande?

Ich wäre Euch sehr dankbar, wenn Ihr mir da weiterhelfen könntet.
 

panamajo

Guru
utopos schrieb:
Wohlgemerkt, ich möchte auf einem einzelnen Rechner alles haben, ohne Datenbank auf einem Server und so ...
Dann bleibt eigentlich nur sqlite. Über welche Sprache du sqlite ansprichst ist eigentlich egal.

http://www.sqlite.org/docs.html
 

abgdf

Guru
Hi,

auch SQLite ist mit Python möglich:

http://www.devshed.com/c/a/Python/Using-SQLite-in-Python/

Bisher hatte ich persönlich wie gesagt eher mit MySQL zu tun. Wie das mit Python geht, hatte ich hier mal aufgeschrieben:

http://www.angelfire.com/linux/tux25/python/python.html#16

Was Python ist und wie man damit unter Windows UND Linux umgeht, steht weiter oben auf der Seite. Auf Deinem Linux-System ist es wahrscheinlich schon installiert.

Wie man einen MySQL-Server unter Linux aufsetzt, war mal relativ kurz z.B. auf dieser Seite beschrieben (aber vergiß erstmal alles, was mit dem dortigen Programm ("kumula") zu tun hat):

http://kumula.sourceforge.net/install.html

Python ist eine plattformübergreifende Sprache, das heißt, Python-Skripte laufen deutlich einfacher sowohl unter Windows und Linux als C++-Programme, die ggf. auf speziellen Bibliotheken aufbauen.

Es ist nicht erforderlich, daß der MySQL-Server auf einem anderen Rechner läuft als der MySQL-Client. Auch auf lokalen Einzelsystemen sind also MySQL-Datenbanken möglich, auch unter Windows:

http://dev.mysql.com/doc/refman/5.1/en/windows-installation.html

Relativ wenige Daten (so bis ein paar tausend Datensätze) kannst Du natürlich auch in einfachen Textdateien speichern. Die kannst Du in Python z.B. so direkt lesen und speichern:

http://www.angelfire.com/linux/tux25/python/python.html#5

Wenn der Python-Interpreter installiert ist, ist ein Konsolen-Python-Skript für den Benutzer kaum von einem Konsolen-C++-Programm zu unterscheiden, abgesehen davon, daß es halt einen Tick langsamer läuft.

(Gleiches gilt natürlich für Skripte in anderen Skriptsprachen (wie z.B. Perl, Ruby, Tcl)).

Gruß

P.S: Der Vollständigkeit halber: Wenn Du bei mittelgroßen Datenbeständen eine Textdatei in Python so ansprechen möchtest, wie Du es bei einem großen Datenbankserver tun würdest, kannst Du das Modul "anydbm" verwenden:

http://docs.python.org/library/anydbm.html

Achje, ich lern' halt auch immer noch dazu: Neuere Python-Versionen haben offenbar eine eingebaute sqlite3-Datenbank (muß wohl in Python 2.5 dazugekommen sein):

http://openbook.galileocomputing.de/python/python_kapitel_19_003.htm#mjea5883d439a425e2f974548b406b56c0

Das scheint dann wohl am geeignetsten zu sein ... :wink:
 
OP
U

utopos

Member
Spitze!
Das sieht alles recht aussichtsreich aus.
Genehmigt mir noch ein paar Tage zum Ausprobieren, bevor ich das [Gelöst]-Kennzeichen setze
(oder ggf. nachquengele).

Guten Rutsch allerseits!
 

abgdf

Guru
Hallo,

noch was: Unter (SuSE-)Linux sind manche Python-Module nicht in dem Python-Haupt-rpm. Bitte suche ggf. in YaST2 nach "python". Da findet man so Pakete wie "python-mysql...rpm" und "python-sqlite...rpm". "kdebindings3-python...rpm" (oder entsprechendes für Qt4) ist manchmal auch ganz wichtig.
Das sollte man also versuchen, wenn
Code:
import modul
nicht ohne weiteres klappt.

Hier ist sonst noch ein besonders schönes Tutorial zu MySQL und C:

http://www.c-plusplus.de/forum/viewtopic-var-t-is-173240.html

Viele Grüße
 
OP
U

utopos

Member
Es hat tatsächlich etwas länger als ein paar Tage gedauert.

Inzwischen habe ich tatsächlich einen MySQL-Server-und-Client aufgebaut, und seit gestern greife ich tatsächlich auch über mysql.h von C++ auf darüber zu.

Für den Einstieg habe v.a. ich benutzt:
http://zetcode.com/db/mysqlc/

Vielen Dank Euch allen nochmals für Eure Hinweise!

Um es mit Heinrich Heine zu sagen:

Und Rotbart wandte sich zu mir: "Es hat
mit dem Schlagen gar keine Eile.
Was lange währt, wird endlich gut,
gut Ding will haben Weile.

Wer heute nicht kommt, kommt morgen gewiss,
nur langsam wächst die Eiche,
und 'chi va piano, va sano', so heißt
das Sprüchwort im Römischen Reiche.
 

abgdf

Guru
Soso, jetzt hast Du also 4,5 Jahre gebraucht. Ich wette, wenn Du meinem Python-Hinweis oben gefolgt wärst, hättest Du höchstens eine Woche gebraucht.

Na ja, trotzdem Glückwunsch!
 
OP
U

utopos

Member
@abgdf: Im Ernst, damals war es eher eine vage Idee, die sich erst jetzt langsam in konkrete Ideen verwandelte.
Der große Hemmschuh war dabei, dass ich damals ein extrem inkonsistentes und veraltetes System hatte, bei dem ich erst einmal grundlegend aufräumen musste - und da sind dann erst einmal noch andere Probleme aufgetaucht als solche weiteren Vorhaben.

Von python habe ich in erster Linie daher vorerst Abstand genommen, weil mir C++ eben vertrauter ist - dann kann ich wenigstens teilweise auf vorhandenen Erfahrungen aufbauen.
 
Oben