Стандартом Python для интерфейсов баз данных является Python DB-API. Большинство интерфейсов баз данных Python соответствуют этому стандарту.
Вы можете выбрать необходимую базу данных для своего приложения. Python Database API поддерживает широкий спектр серверов баз данных, таких как:
Ниже приведен список доступных интерфейсов базы данных в Python : интерфейсы базы данных Python и интерфейсы API. Вы должны загрузить отдельный модуль API DB для каждой базы данных, к которой вы должны получить доступ. Например, если вам нужно получить доступ к базе данных Oracle, а также к базе данных MySQL, вы должны загрузить модули базы данных Oracle и MySQL.
API DB предоставляет минимальный стандарт для работы с базами данных с использованием структур и синтаксиса Python, где это возможно. API включает в себя следующее:
Мы бы узнали все понятия, используя MySQL, поэтому давайте поговорим о модуле MySQLdb.
MySQLdb – это интерфейс для подключения к серверу баз данных MySQL из Python. Он реализует Python Database API версии 2.0 и построен поверх API MySQL C.
Прежде чем продолжить, убедитесь, что на вашем компьютере установлена MySQLdb. Просто введите следующее в свой скрипт Python и выполните его:
#!/usr/bin/python import MySQLdb
Если он производит следующий результат, то это означает, что модуль MySQLdb не установлен:
Traceback (most recent call last): File "test.py", line 3, in <module> import MySQLdb ImportError: No module named MySQLdb
Чтобы установить модуль MySQLdb, используйте следующую команду:
Для Ubuntu, используйте следующую команду:
$ sudo apt-get install python-pip python-dev libmysqlclient-dev
Для Fedora, используйте следующую команду:
$ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc
Для командной строки Python используйте следующую команду:
pip install MySQL-python
Прежде чем подключиться к базе данных MySQL, убедитесь в следующем:
Ниже приведен пример подключения к базе данных MySQL “TESTDB”
#!/usr/bin/python import MySQLdb # Открыть соединение с базой данных db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # Подготовка объекта cursor с помощью метода cursor() cursor = db.cursor() # Выполните SQL-запрос с помощью метода execute() cursor.execute("SELECT VERSION()") # Получить одну строку с помощью метода fetchone() data = cursor.fetchone() print "Версия базы данных : %s " % data # отключение от сервера db.close()
Результат данного скрипта на нашей машине Linux будет следующий:
Версия базы данных : 5.7.23
Если соединение установлено с источником данных, объект подключения возвращается и сохраняется в db для дальнейшего использования, в противном случае для db установлено значение None. Затем объект db используется для создания объекта- курсора, который, в свою очередь, используется для выполнения SQL-запросов. Наконец, прежде чем выйти, он гарантирует, что соединение с базой данных будет закрыто и ресурсы будут освобождены.
После установления соединения с базой данных мы готовы создавать таблицы или записи в таблицах базы данных, используя метод execute созданного курсора.
Создадим таблицу базы данных EMPLOYEE:
#!/usr/bin/python import MySQLdb # Открыть соединение с базой данных db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # Подготовка объекта курсора с помощью метода cursor() cursor = db.cursor() # Удалите таблицу, если она уже существует с помощью метода execute() cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # Создайте таблицу согласно требованию 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()
Это необходимо, если вы хотите создать свои записи в таблице базы данных.
В следующем примере выполняется оператор SQL INSERT для создания записи в таблице EMPLOYEE:
#!/usr/bin/python import MySQLdb # Открыть соединение с базой данных db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # Подготовка объекта cursor с помощью метода cursor() cursor = db.cursor() # Подготовьте запрос SQL для вставки записи в базу данных. sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Win', 'AndreyEx', 35, 'M', 75000)""" try: # Выполните команду SQL cursor.execute(sql) # Зафиксировать изменения в базе данных db.commit() except: # Откат в случае ошибки db.rollback() # Отключение от сервера db.close()
Вышеприведенный пример можно записать следующим образом для динамического создания SQL-запросов:
#!/usr/bin/python import MySQLdb # Открыть соединение с базой данных db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # Подготовка объекта cursor с помощью метода cursor() cursor = db.cursor() # Подготовьте запрос SQL для вставки записи в базу данных. sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Win', 'AndreyEx', 35, 'M', 70000) try: # Выполните команду SQL cursor.execute(sql) # Зафиксировать изменения в базе данных db.commit() except: # Откат в случае ошибки db.rollback() # Отключение от сервера db.close()
Следующий сегмент кода – это еще одна форма выполнения, где вы можете передавать параметры напрямую:
.................................. user_id = "test123" password = "password" con.execute('insert into Login values("%s", "%s")' % \ (user_id, password)) ..................................
Операция READ в любой базе данных означает получение некоторой полезной информации из базы данных.
Как только наше соединение с базой данных будет установлено, вы готовы сделать запрос в эту базу данных. Вы можете использовать метод fetchone() для извлечения одного метода записи или fetchall() для извлечения нескольких значений из таблицы базы данных.
Следующая процедура запрашивает все записи из таблицы EMPLOYEE с зарплатой более 65000:
#!/usr/bin/python import MySQLdb # Открыть соединение с базой данных db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # Подготовка объекта cursor с помощью метода cursor() cursor = db.cursor() sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (65000) 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=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Ошибка: не удается получить данные" # Отключение от сервера db.close()
Это приведет к следующему результату:
fname=Win, lname=AndreyEx, age=35, sex=M, income=70000
Операция UPDATE в любой базе данных означает обновление одной или нескольких записей, которые уже доступны в базе данных.
Следующая процедура обновляет все записи, имеющие SEX как «M». Здесь мы увеличиваем возраст всех мужчин на один год.
#!/usr/bin/python import MySQLdb # Открыть соединение с базой данных db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # Подготовка объекта cursor с помощью метода 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()
Операция DELETE требуется, если вы хотите удалить некоторые записи из своей базы данных. Ниже приведена процедура удаления всех записей из EMPLOYEE, где AGE больше 25:
#!/usr/bin/python import MySQLdb # Открыть соединение с базой данных db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # Подготовка объекта cursor с помощью метода cursor() cursor = db.cursor() # Подготовка SQL-запроса для удаления необходимых записей sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (25) try: # Выполните команду SQL cursor.execute(sql) # Зафиксировать изменения в базе данных db.commit() except: # Откат в случае ошибки db.rollback() # Отключение от сервера db.close()
Транзакция – это механизм, обеспечивающий согласованность данных. Транзакции имеют следующие четыре свойства:
API Python DB 2.0 предоставляет два метода для фиксации транзакции или откат транзакции.
Вы уже знаете, как реализовать транзакции. Вот еще один пример:
# Подготовка SQL-запроса для удаления необходимых записей sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (25) try: # Выполните команду SQL cursor.execute(sql) # Зафиксировать изменения в базе данных db.commit() except: # Откат в случае ошибки db.rollback()
Commit – это операция, которая дает зеленый сигнал базе данных для завершения изменений, и после этой операции никакие изменения не могут быть возвращены обратно.
Вот простой пример вызова метода commit.
db.commit()
Если вы не удовлетворены одним или несколькими изменениями и хотите полностью вернуть эти изменения, используйте метод rollback().
Вот простой пример для вызова метода rollback().
db.rollback()
Чтобы отключить соединение с базой данных, используйте метод close().
db.close()
Если соединение с базой данных закрывается пользователем с помощью метода close(), любые незавершенные транзакции откатываются БД. Однако вместо того, чтобы зависеть от какой-либо из деталей реализации более низкого уровня БД, приложению будет лучше вызывать commit или rollback явно.
Существует множество источников ошибок. Несколько примеров – это синтаксическая ошибка в исполняемом SQL-заявлении, сбой подключения или вызов метода выборки для уже отмененного или завершенного дескриптора инструкции.
API БД определяет ряд ошибок, которые должны существовать в каждом модуле базы данных. В приведенной ниже таблице перечислены эти исключения.
№ | Исключение и описание |
---|---|
1 | Warning Используется для нефатальных проблем. Должен быть подкласс StandardError. |
2 | Error Базовый класс для ошибок. Должен быть подкласс StandardError. |
3 | InterfaceError Используется для ошибок в модуле базы данных, а не для самой базы данных. Должен быть подкласс Error. |
4 | DatabaseError Используется для ошибок в базе данных. Должен быть подкласс Error. |
5 | DataError Подкласс DatabaseError, который ссылается на ошибки в данных. |
6 | OperationalError Подкласс DatabaseError, который относится к ошибкам, например, к потере соединения с базой данных. Эти ошибки, как правило, не контролируются скриптом Python. |
7 | IntegrityError Подкласс DatabaseError для ситуаций, которые могут повредить реляционную целостность, такие как ограничения уникальности или внешние ключи. |
8 | Внутренняя ошибка Подкласс DatabaseError, который ссылается на внутренние ошибки модуля базы данных, такие как курсор, которые больше не активны. |
9 | ProgrammingError Подкласс DatabaseError, который ссылается на такие ошибки, как неправильное имя таблицы и другие вещи, которые можно смело винить вас. |
10 | NotSupportedError Подкласс DatabaseError, который ссылается на попытку вызвать неподдерживаемые функциональные возможности. |
Ваши скрипты Python должны обрабатывать эти ошибки, но прежде чем использовать какое-либо из вышеперечисленных исключений, убедитесь, что ваш MySQLdb поддерживает это исключение. Вы можете получить дополнительную информацию о них, прочитав спецификацию DB API 2.0.