Python: Betrieb einer MySQL-Datenbank
Die Python-Standard-Datenbankschnittstelle ist Python DB-API. Python DB-API bietet Entwicklern eine Datenbank-Anwendungsprogrammierschnittstelle.
Die Python-Datenbankschnittstelle unterstützt eine Vielzahl von Datenbanken. Sie können die Datenbank wählen, die zu Ihrem Projekt passt:
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
Sie könnenPython-Datenbankschnittstellen und APIbesuchen, um die detaillierte Liste der unterstützten Datenbanken anzuzeigen.
Für verschiedene Datenbanken müssen Sie verschiedene DB-API-Module herunterladen. Wenn Sie beispielsweise auf Oracle- und MySQL-Datenbanken zugreifen möchten, müssen Sie die Oracle- und MySQL-Datenbankmodule herunterladen.
DB-API ist eine Spezifikation. Sie definiert eine Reihe erforderlicher Objekte und Datenbankzugriffsmethoden, um eine einheitliche Zugriffsschnittstelle für eine Vielzahl zugrunde liegender Datenbanksysteme und eine breite Palette von Datenbankschnittstellenprogrammen bereitzustellen.
Die DB-API von Python implementiert Schnittstellen für die meisten Datenbanken. Nachdem Sie damit eine Verbindung zu jeder Datenbank hergestellt haben, können Sie alle Datenbanken auf die gleiche Weise bedienen.
Verwendungsablauf der Python-DB-API:
- Das API-Modul importieren.
- Die Verbindung zur Datenbank herstellen.
- SQL-Anweisungen und gespeicherte Prozeduren ausführen.
- Die Datenbankverbindung schließen.
Was ist MySQLdb?
MySQLdb ist eine Schnittstelle für Python, um eine Verbindung zur MySQL-Datenbank herzustellen. Sie implementiert die Python Database API-Spezifikation V2.0 und baut auf der MySQL C API auf.
Wie installiert man MySQLdb?
Um MySQL-Skripte mit DB-API zu schreiben, müssen Sie sicherstellen, dass MySQL installiert ist. Kopieren Sie den folgenden Code und führen Sie ihn aus:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb
Wenn die Ausgabe nach der Ausführung wie unten gezeigt aussieht, bedeutet das, dass Sie das MySQLdb-Modul nicht installiert haben:
Traceback (most recent call last):
File "test.py", line 3, in <module>
import MySQLdb
ImportError: No module named MySQLdb
Um MySQLdb zu installieren, besuchen Sie bittehttp://sourceforge.net/projects/mysql-python, (auf Linux-Plattformen können Sie besuchen:https://pypi.python.org/pypi/MySQL-python) Von hier aus können Sie ein für Ihre Plattform geeignetes Installationspaket wählen, unterteilt in vorkompilierte Binärdateien und Quellcode-Installationspakete.
Wenn Sie die binäre Release-Version wählen, kann der Installationsprozess im Wesentlichen durch Befolgen der Installationsaufforderungen abgeschlossen werden. Wenn Sie aus dem Quellcode installieren, müssen Sie in das oberste Verzeichnis der MySQLdb-Release-Version wechseln und die folgenden Befehle eingeben:
$ gunzip MySQL-python-1.2.2.tar.gz $ tar -xvf MySQL-python-1.2.2.tar $ cd MySQL-python-1.2.2 $ python setup.py build $ python setup.py install
Hinweis:Bitte stellen Sie sicher, dass Sie über root-Rechte verfügen, um das obige Modul zu installieren.
Datenbankverbindung
Bevor Sie eine Verbindung zur Datenbank herstellen, bestätigen Sie bitte Folgendes:
- Sie haben die Datenbank TESTDB erstellt.
- In der Datenbank TESTDB haben Sie die Tabelle EMPLOYEE erstellt.
- Die Felder der Tabelle EMPLOYEE sind FIRST_NAME, LAST_NAME, AGE, SEX und INCOME.
- Der Benutzername, der zum Herstellen einer Verbindung zur TESTDB-Datenbank verwendet wird, ist "testuser", und das Passwort ist "test123". Sie können eigene festlegen oder direkt den root-Benutzernamen und sein Passwort verwenden. Für die Benutzerautorisierung der MySQL-Datenbank verwenden Sie bitte den Befehl GRANT.
- Sie haben das Python-Modul MySQLdb auf Ihrem Rechner installiert.
- Wenn Sie mit SQL-Anweisungen nicht vertraut sind, können Sie unserSQL-Grundlagen-Tutorial besuchen
Beispiel:
Das folgende Beispiel stellt eine Verbindung zu MySQLs TESTDB-Datenbank her:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
data = cursor.fetchone()
print "Database version : %s " % data
# 关闭数据库连接
db.close()
Die Ausgabe nach Ausführung des obigen Skripts ist wie folgt:
Database version : 5.0.45
Datenbanktabellen erstellen
Wenn die Datenbankverbindung existiert, können wir die Methode execute() verwenden, um Tabellen für die Datenbank zu erstellen, wie unten am Erstellen der Tabelle EMPLOYEE gezeigt:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 如果数据表已经存在使用 execute() 方法删除表。
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 创建数据表SQL语句
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# 关闭数据库连接
db.close()
Datenbank-Einfügeoperation
Das folgende Beispiel fügt Datensätze in die Tabelle EMPLOYEE ein, indem es eine SQL-INSERT-Anweisung ausführt:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# 关闭数据库连接
db.close()
Das obige Beispiel kann auch in der folgenden Form geschrieben werden:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES (%s, %s, %s, %s, %s )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()
Beispiel:
Der folgende Code verwendet Variablen, um Parameter an SQL-Anweisungen zu übergeben:
..................................
user_id = "test123"
password = "password"
con.execute('insert into Login values(%s, %s)' % \
(user_id, password))
..................................
Datenbank-Abfrageoperation
Python fragt MySQL mit der Methode fetchone() ab, um einen einzelnen Datensatz abzurufen, und mit der Methode fetchall(), um mehrere Datensätze abzurufen.
- fetchone():Diese Methode ruft die nächste Abfrageergebnismenge ab. Die Ergebnismenge ist ein Objekt.
- fetchall():Empfängt alle zurückgegebenen Ergebniszeilen.
- rowcount:Dies ist ein schreibgeschütztes Attribut und gibt die Anzahl der betroffenen Zeilen nach Ausführung der Methode execute() zurück.
Beispiel:
Alle Daten in der Tabelle EMPLOYEE abfragen, bei denen das Feld salary größer als 1000 ist:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (1000)
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print "fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
(fname, lname, age, sex, income )
except:
print "Error: unable to fetch data"
# 关闭数据库连接
db.close()
Das Ausführungsergebnis des obigen Skripts ist wie folgt:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
Datenbank-Aktualisierungsoperation
Die Aktualisierungsoperation wird verwendet, um Daten in Datentabellen zu aktualisieren. Das folgende Beispiel erhöht das Feld AGE von Datensätzen in der Tabelle EMPLOYEE, deren Feld SEX 'M' ist, um 1:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
# 执行SQL语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()
Löschoperation
Die Löschoperation wird verwendet, um Daten aus Datentabellen zu löschen. Das folgende Beispiel zeigt das Löschen aller Daten in der Tabelle EMPLOYEE, bei denen AGE größer als 20 ist:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 提交修改
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭连接
db.close()
Durchführen von Transaktionen
Der Transaktionsmechanismus kann die Datenkonsistenz gewährleisten.
Eine Transaktion sollte vier Eigenschaften haben: Atomarität, Konsistenz, Isolation und Dauerhaftigkeit. Diese vier Eigenschaften werden üblicherweise als ACID-Eigenschaften bezeichnet.
- Atomarität. Eine Transaktion ist eine unteilbare Arbeitseinheit; die in einer Transaktion enthaltenen Operationen werden entweder alle ausgeführt oder keine.
- Konsistenz. Eine Transaktion muss die Datenbank von einem konsistenten Zustand in einen anderen konsistenten Zustand überführen. Konsistenz ist eng mit der Atomarität verbunden.
- Isolation. Die Ausführung einer Transaktion darf nicht durch andere Transaktionen beeinträchtigt werden. Das heißt, die Operationen innerhalb einer Transaktion und die von ihr verwendeten Daten sind von anderen gleichzeitigen Transaktionen isoliert, und gleichzeitig ausgeführte Transaktionen dürfen sich nicht gegenseitig beeinträchtigen.
- Dauerhaftigkeit. Dauerhaftigkeit wird auch als Permanenz bezeichnet und bedeutet, dass die Änderungen einer Transaktion an den Daten in der Datenbank nach dem Festschreiben dauerhaft sein sollten. Nachfolgende Operationen oder Fehler sollten keinen Einfluss darauf haben.
Python DB API 2.0 bietet zwei Methoden für Transaktionen: commit oder rollback.
Beispiel:
# SQL删除记录语句 sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20) try: # 执行SQL语句 cursor.execute(sql) # 向数据库提交 db.commit() except: # 发生错误时回滚 db.rollback()
Für Datenbanken, die Transaktionen unterstützen, beginnt in der Python-Datenbankprogrammierung beim Einrichten eines Cursors automatisch eine implizite Datenbanktransaktion.
Die Methode commit() schreibt alle Aktualisierungsoperationen des Cursors fest, und die Methode rollback() macht alle Operationen des aktuellen Cursors rückgängig. Jede Methode startet eine neue Transaktion.
Fehlerbehandlung
Die DB API definiert einige Fehler und Ausnahmen für Datenbankoperationen. Die folgende Tabelle listet diese Fehler und Ausnahmen auf:
| Ausnahme | Beschreibung |
|---|---|
| Warnung | Wird bei einer schwerwiegenden Warnung ausgelöst, zum Beispiel wenn eingefügte Daten abgeschnitten werden usw. Muss eine Unterklasse von StandardError sein. |
| Fehler | Alle Fehlerklassen außer Warnungen. Muss eine Unterklasse von StandardError sein. |
| InterfaceError | Wird ausgelöst, wenn ein Fehler des Datenbankschnittstellenmoduls selbst (und nicht ein Fehler der Datenbank) auftritt. Muss eine Unterklasse von Error sein. |
| DatabaseError | Wird ausgelöst, wenn ein datenbankbezogener Fehler auftritt. Muss eine Unterklasse von Error sein. |
| DataError | Wird bei einem Datenverarbeitungsfehler ausgelöst, zum Beispiel: Division durch Null, Daten außerhalb des gültigen Bereichs usw. Muss eine Unterklasse von DatabaseError sein. |
| OperationalError | Bezieht sich auf Fehler, die nicht unter der Kontrolle des Benutzers stehen, aber beim Betrieb der Datenbank auftreten. Zum Beispiel: unerwartete Trennung, Datenbankname nicht gefunden, Fehler bei der Transaktionsverarbeitung, Speicherzuweisungsfehler und andere Fehler, die beim Betrieb der Datenbank auftreten. Muss eine Unterklasse von DatabaseError sein. |
| IntegrityError | Integritätsbezogene Fehler, wie das Fehlschlagen einer Fremdschlüsselprüfung usw. Muss eine Unterklasse von DatabaseError sein. |
| InternalError | Interne Datenbankfehler, wie ein ungültiger Cursor, Fehler bei der Transaktionssynchronisierung usw. Muss eine Unterklasse von DatabaseError sein. |
| ProgrammingError | Programmierfehler, wie eine Tabelle nicht gefunden oder bereits vorhanden, Syntaxfehler in SQL-Anweisungen, falsche Anzahl von Parametern usw. Muss eine Unterklasse von DatabaseError sein. |
| NotSupportedError | Nicht unterstützte Fehler, die sich auf die Verwendung von Funktionen oder APIs beziehen, die die Datenbank nicht unterstützt. Zum Beispiel die Verwendung der Funktion .rollback() für ein Verbindungsobjekt, aber die Datenbank unterstützt keine Transaktionen oder Transaktionen wurden deaktiviert. Muss eine Unterklasse von DatabaseError sein. |