Mit MySQL in Python arbeiten

Python unterstützt von Haus aus nicht die Arbeit mit MySQL-Datenbanken. Diese Funktionalität kann man Python aber beibringen. Eine entsprechende Anleitung und erste Schritte möchte ich folgend vorstellen.

Die Installation

Wir müssen das Paket „mysql-connector-python“ von Hand installieren. Dazu laden wir das Paket herunter, entpacken es und führen die Installation aus:

wget "http://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python-1.0.9.tar.gz/from/http://cdn.mysql.com/" -O mysql-connector.tar
tar xfv mysql-connector.tar
cd mysql-connector-python*
chmod +x ./setup.py
sudo ./setup.py install

Nachdem die Installation erfolgreich war, kann man nun das Paket „mysql“ in seinen Projekten importieren.

Hinweis: Laut Dokumentation müsste der Import „MySQLdb“ lauten. Scheinbar wurde dieser durch „mysql“ ersetzt.

Verbindung herstellen

Um mit einer MySQL-Datenbank zu arbeiten müssen wir innerhalb des Python-Scriptes eine Verbindung zum MySQL-Server herstellen.

#!/usr/bin/python2.7

import mysql;
import mysql.connector;

try:
    connection = mysql.connector.connect(host = "localhost", user = "user", passwd = "Passwort", db = "Datenbank1")
except:
    print "Keine Verbindung zum Server"
    exit(0)

Falls die Verbindung erfolgreich hergestellt werden konnte, haben wir diese in der Variable „connection“. Andernfalls bricht das Script ab.

 Eine Tabelle anlegen

Um mit verschiedenen Daten zu arbeiten, benötigen wir zunächst eine Tabelle. Diese kann man mit der gewohnt MySQL-Syntax erzeugen. Wir holen uns dazu erstmal den cursor von der Verbindung, mit dem wir dann die Operationen durchführen. Nach Möglichkeit sollte der cursor immer geschlossen werden.

#Tabelle erzeugen
cursor = connection.cursor()
cursor.execute("CREATE TABLE test (id int(3), text varchar(255))")
cursor.close()

Allgemein werden wir später diesem Schema folgen.

Datensätze eintragen

Nachdem wir nun eine Verbindung und eine Tabelle haben, können wir neue Datensätze hinzufügen.

#Datensatz einfügen
cursor = connection.cursor()
cursor.execute("INSERT INTO test (id,text) VALUES (%s,%s)",("1","Hallo Welt",))
cursor.execute("INSERT INTO test (id,text) VALUES (%s,%s)",("2","Hallo Blog",))
cursor.execute("INSERT INTO test (id,text) VALUES (%s,%s)",("3","Hallo Mond",))
cursor.close()
connection.commit()

Nun sollten wir die drei Datensätze in der Tabelle test haben. Vielleicht falls euch an diesem Quelltext zwei komische Sachen auf. 

  • (%s,%s) : Wir nutzen Platzhalter, damit wir uns vor SQL Injection schützen. Die Daten werden intern entsprechend maskiert.
  • („3″,“Hallo Welt“,) : Wenn man genauer hinschaut, erkennt man das „,“ am Ende in der Klammer. Das müssen wir dort immer anfügen, damit Python die Angaben korrekt in ein Tupel umwandelt.

Daten auslesen

Die Daten können wir mit einem Select-Query auslesen. Dann liefert uns der cursor über .fetchall() eine Liste mit allen Werten.

#Datensätze auslesen
cursor = connection.cursor()
cursor.execute("SELECT * from test")
result = cursor.fetchall()
cursor.close()

for data in result:
    print "Nummer: " + str(data[0]) + "; Text: " + data[1]

Die entsprechenden Daten sollten nun auf dem Bildschirm erscheinen.

Fazit

Man kann gut mit MySQL-Datenbanken in Python arbeiten. Zum Abschluss nochmal den kompletten Code als kleine Übersicht:

#!/usr/bin/python2.7

import mysql;
import mysql.connector;

#Verbindung erstellen
try:
    connection = mysql.connector.connect(host = "localhost", user = "user", passwd = "Passwort", db = "Datenbank1")
except:
    print "Keine Verbindung zum Server"
    exit(0)

#Tabelle erzeugen
cursor = connection.cursor()
cursor.execute("CREATE TABLE test (id int(1), text varchar(255))")
cursor.close()

#Datensatz einfügen
cursor = connection.cursor()
cursor.execute("INSERT INTO test (id,text) VALUES (%s,%s)",("1","Hallo Welt",))
cursor.execute("INSERT INTO test (id,text) VALUES (%s,%s)",("2","Hallo Welt",))
cursor.execute("INSERT INTO test (id,text) VALUES (%s,%s)",("3","Hallo Welt",))
cursor.close();
connection.commit()

#Datensätze auslesen
cursor = connection.cursor()
cursor.execute("SELECT * from test")
result = cursor.fetchall()
cursor.close()

for data in result:
    print "Nummer: " + str(data[0]) + "; Text: " + data[1]

~Sebastian