Коней на переправе не меняют (А. Линкольн).

Python – доступ к базе данных MySQL

FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (4 оценок, среднее: 5,00 из 5)
Загрузка...
6 октября 2018
Python - доступ к базе данных MySQL
Стандартом Python для интерфейсов баз данных является Python DB-API. Большинство интерфейсов баз данных Python соответствуют этому стандарту.

Вы можете выбрать необходимую базу данных для своего приложения. Python Database API поддерживает широкий спектр серверов баз данных, таких как:

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

Ниже приведен список доступных интерфейсов базы данных в Python : интерфейсы базы данных Python и интерфейсы API. Вы должны загрузить отдельный модуль API DB для каждой базы данных, к которой вы должны получить доступ. Например, если вам нужно получить доступ к базе данных Oracle, а также к базе данных MySQL, вы должны загрузить модули базы данных Oracle и MySQL.

API DB предоставляет минимальный стандарт для работы с базами данных с использованием структур и синтаксиса Python, где это возможно. API включает в себя следующее:

  • Импорт модуля API.
  • Получение соединения с базой данных.
  • Выдача операторов SQL и хранимых процедур.
  • Закрытие соединения

Мы бы узнали все понятия, используя MySQL, поэтому давайте поговорим о модуле MySQLdb.

Что такое MySQLdb?

MySQLdb – это интерфейс для подключения к серверу баз данных MySQL из Python. Он реализует Python Database API версии 2.0 и построен поверх API MySQL C.

Как установить MySQLdb?

Прежде чем продолжить, убедитесь, что на вашем компьютере установлена 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

 

Убедитесь, что у вас есть привилегия root для установки модуля.

 

Подключение к базе данных

Прежде чем подключиться к базе данных MySQL, убедитесь в следующем:

  • Вы создали базу данных TESTDB.
  • Вы создали таблицу EMPLOYEE в TESTDB.
  • В этой таблице есть поля FIRST_NAME, LAST_NAME, AGE, SEX and INCOME.
  • Идентификатор пользователя «testuser» и пароль «test123» установлены для доступа к TESTDB.
  • Модуль Python MySQLdb установлен правильно на вашем компьютере.
  • Вы изучили руководство MySQL, чтобы понять основы 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()

 

Операция INSERT

Это необходимо, если вы хотите создать свои записи в таблице базы данных.

Пример

В следующем примере выполняется оператор 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

Операция READ в любой базе данных означает получение некоторой полезной информации из базы данных.

Как только наше соединение с базой данных будет установлено, вы готовы сделать запрос в эту базу данных. Вы можете использовать метод fetchone() для извлечения одного метода записи или fetchall() для извлечения нескольких значений из таблицы базы данных.

  • fetchone() – выбор следующей строки набора результатов запроса. Набор результатов – это возвращаемый объект, когда объект курсора используется для запроса таблицы.
  • fetchall() – извлекает все строки в результирующем наборе. Если некоторые строки уже извлечены из набора результатов, то он извлекает оставшиеся строки из набора результатов.
  • rowcount – это атрибут только для чтения и возвращает количество строк, на которые повлиял метод execute().

 

Пример

Следующая процедура запрашивает все записи из таблицы 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

Операция 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 – это операция, которая дает зеленый сигнал базе данных для завершения изменений, и после этой операции никакие изменения не могут быть возвращены обратно.

Вот простой пример вызова метода commit.

db.commit()

 

Операция ROLLBACK

Если вы не удовлетворены одним или несколькими изменениями и хотите полностью вернуть эти изменения, используйте метод rollback().

Вот простой пример для вызова метода rollback().

db.rollback()

 

Отключение базы данных

Чтобы отключить соединение с базой данных, используйте метод close().

db.close()

 

Если соединение с базой данных закрывается пользователем с помощью метода close(), любые незавершенные транзакции откатываются БД. Однако вместо того, чтобы зависеть от какой-либо из деталей реализации более низкого уровня БД, приложению будет лучше вызывать commit или rollback явно.

Обработка ошибок

Существует множество источников ошибок. Несколько примеров – это синтаксическая ошибка в исполняемом SQL-заявлении, сбой подключения или вызов метода выборки для уже отмененного или завершенного дескриптора инструкции.

API БД определяет ряд ошибок, которые должны существовать в каждом модуле базы данных. В приведенной ниже таблице перечислены эти исключения.

Исключение и описание
1Warning

Используется для нефатальных проблем. Должен быть подкласс StandardError.

2Error

Базовый класс для ошибок. Должен быть подкласс StandardError.

3InterfaceError

Используется для ошибок в модуле базы данных, а не для самой базы данных. Должен быть подкласс Error.

4DatabaseError

Используется для ошибок в базе данных. Должен быть подкласс Error.

5DataError

Подкласс DatabaseError, который ссылается на ошибки в данных.

6OperationalError

Подкласс DatabaseError, который относится к ошибкам, например, к потере соединения с базой данных. Эти ошибки, как правило, не контролируются скриптом Python.

7IntegrityError

Подкласс DatabaseError для ситуаций, которые могут повредить реляционную целостность, такие как ограничения уникальности или внешние ключи.

8Внутренняя ошибка

Подкласс DatabaseError, который ссылается на внутренние ошибки модуля базы данных, такие как курсор, которые больше не активны.

9ProgrammingError

Подкласс DatabaseError, который ссылается на такие ошибки, как неправильное имя таблицы и другие вещи, которые можно смело винить вас.

10NotSupportedError

Подкласс DatabaseError, который ссылается на попытку вызвать неподдерживаемые функциональные возможности.

 

Ваши скрипты Python должны обрабатывать эти ошибки, но прежде чем использовать какое-либо из вышеперечисленных исключений, убедитесь, что ваш MySQLdb поддерживает это исключение. Вы можете получить дополнительную информацию о них, прочитав спецификацию DB API 2.0.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Просмотров: 23

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

    Добавить комментарий

    Войти с помощью: 

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам:

    Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

    badge
    Обратный звонок 1
    Отправить
    galka

    Спасибо! Ваша заявка принята

    close
    galka

    Спасибо! Ваша заявка принята

    close