Python und MariaDB-Server | Inserts nicht möglich

fwrede

Benutzer
Beiträge
5
Hallo.
Ich habe ein Problem mit meinem MariaDB-Server.
Auf diesem habe ich verschiedene Datenbanken laufen. Ich habe phpMyAdmin installiert um auch über den Browser auf die Datenbanken zugreifen zu können.

Unter python nutze ich die Bibliothek pymysql um mich mit dem Datenbankserver zu verbinden. Der MariaDB Conector funktioniert leider gar nicht. Um Daten aus der Datenbank auszulesen, klappt das auch sehr gut. Wenn ich aber über die gleichen Befehle mittels INSERT Daten in die Datenbank schreiben möchte, so geht dies leider nicht. Der Fehler ist dabei immer der selbe:
  • Es gibt keinen Python-Fehler
  • Es gibt keinen SQL-Fehler
  • Der Schlüssel der Tabelle wird durch Autoincrement nach jedem Durchlauf des Programs um 1 erhöht
  • Es erscheinen die restlichen Daten nicht in der Datenbank, auch keine leere Zeile.
Da ich leider keinen Fehler bekomme, aber scheinbar die Datenbank zumindest angefragt wird (da durch Autoincrement der Schlüssel erhöht wird), weiß ich echt nicht mehr weiter. Wenn ich aus dem Python-Script einen Subprozess starte, der dann ein shell-Script mit dem SQL-Befehl aus dem python-Program ausführt, werden die Daten auch in der Datenbank sichtbar. Genau so ist es, wenn ich den SQL-Befehl im Terminal unter Linux direkt eingebe. Nur im Programm selbst wird nur der Autoincrement-Wert erhöht. Im Anhang habe ich noch einmal ein Bild von meinem Code und der Ausgabe auf Komandozeile.

Ich freue mich über eure Antworten.

Viele Grüße
fwrede
 

Anhänge

  • Python_Code.JPG
    Python_Code.JPG
    54,2 KB · Aufrufe: 1
  • Result.jpeg
    Result.jpeg
    49,1 KB · Aufrufe: 1
Werbung:
Update:
Ich Idiot habe den Commit vergessen, habe gerade erst in der Doc von MariaDB gesehen, dass dieser Commit wichtig ist, damit die Daten in die Datenbank geschrieben werden...

Viele Grüße
fwrede
 
Du hättest auch einen DDL-Befehle hinschicken können, das macht bei MySQL und vielen anderen billigen Datenbanken einen implizieten COMMIT. Transactional DDL können nur sehr wenige Datenbanken ;-)
Und ja, fehlendes COMMIT war auch mein erster Gedanke, war aber unterwegs und konnte nicht gleich antworten...
 
@akretschmer
Vielen Dank für die Antwort.
Ja ich gebe zu, dass war ein sehr dummer Fehler ;)
Aber was meinst du mit DDL-Befehl? Ist INSERT nicht Teil der SQL DDL?

Viele Grüße
fwrede
 
Insert ist DML: Data Manipulating Language. DDL ist Data Definition Language. MySQL kann unter bestimmten Bedingungen Transaktionen, aber nicht immer, nicht vollständig und nicht bei Gewitter.
 
@akretschmer
Ach stimmt... Das habe ich gerade verwechselt. Mir war gerade nur noch SQL-DQL und halt SQL-DDL im Kopf und dann habe ich es gedanklich einfach mal bei DDL rein geschoben...

Wie ich das so rauslese, bist du nicht der größte Fan von MySQL bzw. mittlerweile ja MariaDB? 🙈
 
Werbung:
PostgreSQL hat deutlich mehr und bessere Features und hat eine freiere Lizenz.

Kann ich nur bestätigen, hatte davor keine Ahnung was für ein SQL am laufen (Apache OpenOffice Base, was auch immer), bin aber inzwischen auch schon vor einer längeren Zeit durch den Schupser von mr. Elephant zu PostgreSQL gewechselt, und bin sehr zufrieden damit :D

Habe mehr Komplikationen mit anderen Sprachen, die wiederum den Zugriff auf die Datenbank vereinfachen sollen (PHP und PY)

Soweit ich Erfahrungen aus PY und PGSQL gesammelt habe, kann man da eine Funktion aufrufen, damit sich die SQL-Befehle automatisch commiten.

Hier ein Beispiel von meinem kleinen PY Programm ;)
Code:
import psycopg2

# Datenbankverbindung (Mimoso)
conn2db = psycopg2.connect("dbname=mimoso user=postgres host=0815.1234.5678")
pgcursor = conn2db.cursor()
conn2db.set_session(autocommit=True)

if (conn2db):
    pass
else:
    print("Verbindung nicht möglich!")
    window.root.destroy()

Keine Ahnung, ob das auch bei anderen Modulen möglich ist, aber wie gehabt kann ich PostgreSQL ebenfalls empfehlen ;)

EDIT:
Wollte eigentlich die Zeile mit conn2db.set_session(autocommit=True) betonen, geht aber irgendwie nicht....

EDIT2:
Scheint nur in code-tags nicht möglich zu sein ;)
 
Zurück
Oben