Articlename: MySQL-Zugriff mit Python Keywords: python mysql access zugriff pymsql mysqldb howto tutorial Date: 07.04.2008, 09:54 Views: 151 Categoryname: MySQL ---------------------------------------- Der MySQL-Zugriff über Python erfolgt nicht ganz intuitiv, speziell bei ehemaligen PHP-Entwicklern :) ------- Code ------- import MySQLdb ------- End-Code ------- Zunächst müssen wir das MySQL-Modul laden. Ist eine ausreichend aktuelle Version für die Distribution nicht verfügbar, muss es aus den Quellen gebaut werden. Dabei werden mindestens die Development-Pakete von MySQL und Python benötigt. ------- Code ------- mysql_opts = { 'host': "localhost", 'user': "mein_user", 'pass': "mein_pw", 'db': "meine_db" } mysql = MySQLdb.connect(mysql_opts['host'], mysql_opts['user'], mysql_opts['pass'], mysql_opts['db']) ------- End-Code ------- Nach diesen beiden Zeilen haben wir nun eine offene MySQL-Verbindung, welche wir über das Objekt mysql ansprechen können. ------- Code ------- mysql.apilevel = "2.0" mysql.threadsafety = 2 mysql.paramstyle = "format" ------- End-Code ------- Die erste Option setzt den API-Level für die Kommunikation zwischen Python und MySQL (bis jetzt hat für mich die aktuelle Version "2.0" immer problemlos funktioniert). Die Threadsafety-Option bekommt ihre Bedeutung erst bei Thread-Programmierung, wobei auch hier die Stufe 2 meistens passen sollte. Das Format gibt an, wie Variablen im SQL-Befehl gekennzeichnet sind. format steht beispielsweise für den C-Syntax %s (Achtung: alles ist ein String, da auch Zahlen automatisch in '123' umgewandelt werden). Eine andere Möglichkeit wäre pyformat (entspricht: %(varname)s). ------- Code ------- cursor = mysql.cursor() cursor.execute("SELECT * FROM `products`") products = cursor.fetchall() ------- End-Code ------- In der ersten Zeile wird ein sogenannter 'Cursor' erstellt, mit welchem man nun auf die MySQL-DB zugreifen kann. Über mehrere Cursor können Abfragen parallelisiert werden. Zeile zwei übergibt den SQL-Befehl wärend Zeile drei das Ergebnis einer Variable zuweist. Der Inhalt von products hat nun folgendes Format ( ('wert_von_spalte1_und_zeile1', 'wert_von_spalte2_und_zeile1'), ('wert_von_spalte1_und_zeile2', 'wert_von_spalte2_und_zeile2') ) ------- Code ------- cursor.execute("SELECT `id`, `name` FROM `customers` WHERE `product_id`=%s", products[0][0]) customer = cursor.fetchone() ------- End-Code ------- Mit diesem Zweizeiler wird eine einzelne Zeile abgefragt. Das Ergebnis in customer könnte so aussehen: ( '123', 'mein name' ) Der große Vorteile liegt beim automatischen Escapen und umwandeln der Werte. So können beispielsweise MySQL-Datetime-Spalten direkt mit datetime-Objekten verglichen werden und None-Werte werden in NULL übersetzt. Für weiterführende Informationen empfiehlt sich das Studium der in Python integrierten Hilfe, sowie der (teilweise recht unübersichtlichen) Manuals auf der Homepage (http://mysql-python.sourceforge.net).