Python - dostęp do bazy danych MySQL

Standardem Pythona dla interfejsów baz danych jest Python DB-API. Większość interfejsów baz danych Pythona jest zgodnych z tym standardem.

Możesz wybrać odpowiednią bazę danych dla swojej aplikacji. Python Database API obsługuje szeroką gamę serwerów baz danych, takich jak -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase

Oto lista dostępnych interfejsów baz danych Pythona : Python Database Interfaces and APIs . Musisz pobrać oddzielny moduł DB API dla każdej bazy danych, do której chcesz uzyskać dostęp. Na przykład, jeśli potrzebujesz dostępu do bazy danych Oracle, a także do bazy danych MySQL, musisz pobrać zarówno moduły bazy danych Oracle, jak i MySQL.

DB API zapewnia minimalny standard pracy z bazami danych przy użyciu struktur i składni Pythona, jeśli tylko jest to możliwe. Ten interfejs API obejmuje następujące -

  • Importowanie modułu API.
  • Uzyskanie połączenia z bazą danych.
  • Wydawanie instrukcji SQL i procedur składowanych.
  • Zamykanie połączenia

Uczylibyśmy się wszystkich pojęć używając MySQL, więc porozmawiajmy o module MySQLdb.

Co to jest MySQLdb?

MySQLdb to interfejs do łączenia się z serwerem bazy danych MySQL z języka Python. Implementuje Python Database API v2.0 i jest zbudowany na bazie MySQL C. API.

Jak zainstalować MySQLdb?

Zanim przejdziesz dalej, upewnij się, że masz zainstalowaną MySQLdb na swoim komputerze. Po prostu wpisz następujące polecenie w swoim skrypcie Pythona i uruchom go -

#!/usr/bin/python

import MySQLdb

Jeśli daje następujący wynik, oznacza to, że moduł MySQLdb nie jest zainstalowany -

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      import MySQLdb
ImportError: No module named MySQLdb

Aby zainstalować moduł MySQLdb, użyj następującego polecenia -

For Ubuntu, use the following command -
$ sudo apt-get install python-pip python-dev libmysqlclient-dev For Fedora, use the following command - $ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc
For Python command prompt, use the following command -
pip install MySQL-python

Note - Upewnij się, że masz uprawnienia roota do zainstalowania powyższego modułu.

Połączenie z bazą danych

Przed połączeniem się z bazą danych MySQL upewnij się, że:

  • Utworzyłeś bazę danych TESTDB.

  • Utworzyłeś tabelę PRACOWNIK w TESTDB.

  • Ta tabela zawiera pola FIRST_NAME, LAST_NAME, AGE, SEX i INCOME.

  • ID użytkownika „testuser” i hasło „test123” są ustawione na dostęp do bazy danych TESTDB.

  • Moduł Pythona MySQLdb jest poprawnie zainstalowany na Twoim komputerze.

  • Przeszedłeś przez samouczek MySQL, aby zrozumieć podstawy MySQL.

Przykład

Poniżej znajduje się przykład połączenia z bazą danych MySQL „TESTDB”

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")

# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print "Database version : %s " % data

# disconnect from server
db.close()

Podczas uruchamiania tego skryptu generuje następujący wynik na moim komputerze z systemem Linux.

Database version : 5.0.45

Jeśli połączenie zostanie nawiązane ze źródłem danych, obiekt połączenia jest zwracany i zapisywany w db do dalszego użytku, w przeciwnym razie dbjest ustawiona na Brak. Kolejny,db obiekt służy do tworzenia pliku cursorobiekt, który z kolei służy do wykonywania zapytań SQL. Wreszcie, przed wyjściem, zapewnia zamknięcie połączenia z bazą danych i zwolnienie zasobów.

Tworzenie tabeli bazy danych

Po nawiązaniu połączenia z bazą danych jesteśmy gotowi do tworzenia tabel lub rekordów w tabelach bazy danych za pomocą execute metoda utworzonego kursora.

Przykład

Stwórzmy tabelę bazy danych PRACOWNIK -

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""

cursor.execute(sql)

# disconnect from server
db.close()

Operacja INSERT

Jest to wymagane, gdy chcesz utworzyć rekordy w tabeli bazy danych.

Przykład

Poniższy przykład wykonuje instrukcję SQL INSERT , aby utworzyć rekord w tabeli EMPLOYEE -

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Powyższy przykład można zapisać w następujący sposób, aby dynamicznie tworzyć zapytania SQL -

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Przykład

Następny segment kodu to kolejna forma wykonania, w której można bezpośrednio przekazywać parametry -

..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
             (user_id, password))
..................................

Operacja READ

READ Operacja na dowolnej bazie danych oznacza pobranie przydatnych informacji z bazy danych.

Po nawiązaniu połączenia z bazą danych możesz wykonać zapytanie do tej bazy danych. Możesz użyć jednego z nichfetchone() metoda pobierania pojedynczego rekordu lub fetchall() metoda pobierania wielu wartości z tabeli bazy danych.

  • fetchone()- Pobiera następny wiersz zestawu wyników zapytania. Zestaw wyników to obiekt, który jest zwracany, gdy obiekt kursora jest używany do zapytania tabeli.

  • fetchall()- Pobiera wszystkie wiersze w zestawie wyników. Jeśli niektóre wiersze zostały już wyodrębnione z zestawu wyników, pobiera pozostałe wiersze z zestawu wyników.

  • rowcount - To jest atrybut tylko do odczytu i zwraca liczbę wierszy, na które wpłynęła metoda execute ().

Przykład

Poniższa procedura odpytuje wszystkie rekordy z tabeli PRACOWNIK z wynagrodzeniem powyżej 1000 -

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (1000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # Now print fetched result
      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

# disconnect from server
db.close()

To da następujący wynik -

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

Operacja aktualizacji

UPDATE Operacja na dowolnej bazie danych oznacza aktualizację jednego lub więcej rekordów, które są już dostępne w bazie danych.

Poniższa procedura aktualizuje wszystkie rekordy zawierające PŁEĆ jako 'M'. Tutaj zwiększamy WIEK wszystkich samców o jeden rok.

Przykład

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
                          WHERE SEX = '%c'" % ('M')
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Operacja USUŃ

Operacja DELETE jest wymagana, gdy chcesz usunąć niektóre rekordy z bazy danych. Poniżej znajduje się procedura usuwania wszystkich zapisów od PRACOWNIKA w wieku powyżej 20 lat -

Przykład

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Wykonywanie transakcji

Transakcje to mechanizm zapewniający spójność danych. Transakcje mają następujące cztery właściwości -

  • Atomicity - Albo transakcja zostaje zakończona, albo nic się nie dzieje.

  • Consistency - Transakcja musi rozpocząć się w stanie zgodnym i pozostawić system w stanie zgodnym.

  • Isolation - Pośrednie wyniki transakcji nie są widoczne poza bieżącą transakcją.

  • Durability - Po zatwierdzeniu transakcji efekty są trwałe, nawet po awarii systemu.

Python DB API 2.0 zapewnia dwie metody zatwierdzania lub wycofywania transakcji.

Przykład

Wiesz już, jak realizować transakcje. Oto znowu podobny przykład -

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

Operacja COMMIT

Commit to operacja, która daje zielony sygnał do bazy danych w celu sfinalizowania zmian, a po tej operacji nie można cofnąć żadnej zmiany.

Oto prosty przykład do zadzwonienia commit metoda.

db.commit()

Operacja ROLLBACK

Jeśli nie jesteś zadowolony z co najmniej jednej zmiany i chcesz całkowicie cofnąć te zmiany, użyj rollback() metoda.

Oto prosty przykład do zadzwonienia rollback() metoda.

db.rollback()

Odłączanie bazy danych

Aby rozłączyć połączenie z bazą danych, użyj metody close ().

db.close()

Jeśli połączenie z bazą danych zostanie zamknięte przez użytkownika metodą close (), wszystkie oczekujące transakcje są wycofywane przez bazę danych. Jednak zamiast polegać na jakichkolwiek szczegółach implementacji DB niższego poziomu, twoja aplikacja będzie lepiej wywoływać jawne zatwierdzanie lub wycofywanie.

Obsługa błędów

Istnieje wiele źródeł błędów. Kilka przykładów to błąd składni w wykonywanej instrukcji SQL, błąd połączenia lub wywołanie metody pobierania dla już anulowanego lub zakończonego uchwytu instrukcji.

Interfejs API bazy danych definiuje liczbę błędów, które muszą występować w każdym module bazy danych. W poniższej tabeli wymieniono te wyjątki.

Sr.No. Wyjątek i opis
1

Warning

Używany w przypadku problemów, które nie są śmiertelne. Musi podklasę StandardError.

2

Error

Klasa bazowa dla błędów. Musi podklasę StandardError.

3

InterfaceError

Używane w przypadku błędów w module bazy danych, a nie w samej bazie danych. Musi podklasa Błąd.

4

DatabaseError

Używane w przypadku błędów w bazie danych. Musi podklasa Błąd.

5

DataError

Podklasa DatabaseError, która odnosi się do błędów w danych.

6

OperationalError

Podklasa DatabaseError, która odnosi się do błędów, takich jak utrata połączenia z bazą danych. Te błędy są na ogół poza kontrolą skryptera języka Python.

7

IntegrityError

Podklasa DatabaseError dla sytuacji, które mogłyby uszkodzić integralność relacji, takich jak ograniczenia unikalności lub klucze obce.

8

InternalError

Podklasa DatabaseError, która odnosi się do błędów wewnętrznych modułu bazy danych, takich jak kursor nie jest już aktywny.

9

ProgrammingError

Podklasa DatabaseError, która odnosi się do błędów, takich jak zła nazwa tabeli i inne rzeczy, za które można bezpiecznie obwiniać Ciebie.

10

NotSupportedError

Podklasa DatabaseError, która odnosi się do próby wywołania nieobsługiwanej funkcjonalności.

Twoje skrypty Pythona powinny obsługiwać te błędy, ale przed użyciem któregokolwiek z powyższych wyjątków upewnij się, że Twoja baza danych MySQLdb obsługuje ten wyjątek. Możesz uzyskać więcej informacji na ich temat, czytając specyfikację DB API 2.0.