Latest web development tutorials

питон операции с базами данных MySQL

стандартный интерфейс базы данных Python для Python DB-API, Python DB-API предоставляет интерфейс прикладного программирования баз данных для разработчиков.

Интерфейс базы данных Python поддерживает очень большие базы данных, вы можете выбрать свой проект базы данных:

  • овод
  • Msql
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • оракул
  • Sybase

Вы можете получить доступ к интерфейса базы данных Python и API См подробный список поддерживаемых баз данных.

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

DB-API является спецификация, которая определяет набор объектов и базы данных режим должен иметь доступ, с тем чтобы обеспечить последовательный интерфейс для доступа широкий спектр базовой системы баз данных и разнообразные программы интерфейса базы данных.

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

Python DB-API, с использованием процесса:

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

Что такое MySQLdb?

MySQLdb представляет собой интерфейс для связи с базой данных Python Mysql, который реализует Python спецификации API Database V2.0, основанный на создании API MySQL C.


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

Для того, чтобы написать MySQL скрипты с DB-API, вы должны убедиться, что вы установили MySQL. Скопируйте следующий код и выполнить его:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

Если вывод заключается в следующем после выполнения, а это значит, у вас нет установлен модуль MySQLdb:

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

Установить MySQLDb, посетить http://sourceforge.net/projects/mysql-python , (платформа Linux можно получить: https://pypi.python.org/pypi/MySQL-python ) Отсюда выбрать для вашей платформы Инсталляционный пакет, предварительно скомпилированных двоичных файлов и в пакете исходного кода.

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

$ 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

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


Связь с базами данных

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

  • Вы создали TESTDB базы данных.
  • В базе данных TESTDB вы создали таблицу сотрудников
  • СОТРУДНИК поля таблицы FIRST_NAME, LAST_NAME, возраст, пол и ДОХОД.
  • Пользователи подключаются к базе данных с использованием TESTDB с именем "TestUser", пароль "test123", вы можете настроить свой собственный прямо или корневой имя пользователя и пароль, Mysql лицензия пользователя базы данных, пожалуйста, используйте команду Grant.
  • На вашей машине уже установлен модуль Python MySQLDb.
  • Если вы не знакомы с утверждением SQL, вы можете посетить наш SQL учебник основы

Пример:

Следующие примеры связи баз данных TESTDB Mysql:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取一条数据库。
data = cursor.fetchone()

print "Database version : %s " % data

# 关闭数据库连接
db.close()

Реализация этого скрипта выводит результаты выглядят следующим образом:

Database version : 5.0.45

Создание таблицы базы данных

Если соединение с базой данных существует, мы можем использовать метод Execute () для создания таблиц для базы данных, создать таблицу сотрудников, показанную в следующем:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用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()

вставка базы данных

В следующем примере используется выполнить SQL INSERT заявление, чтобы вставить запись в таблицу EMPLOYEE:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用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()

Приведенный выше пример можно записать следующим образом:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

# 关闭数据库连接
db.close()

Пример:

Следующий код использует переменные для передачи параметров в SQL заявление:

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

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

запросы к базе данных

Python Mysql запрос с использованием метода fetchone () для получения однократной данных с использованием метода fetchall () для получения множества данных.

  • fetchone (): Этот метод получает следующий набор результатов запроса.Результат представляет собой набор объектов
  • fetchall (): возвращает результат , чтобы получить все строки.
  • ROWCOUNT: Это атрибут только для чтения, и возвращает выполнение выполнения () метод после числа затронутых строк.

Пример:

Discover СОТРУДНИК таблица заработной платы (оплаты труда) поле данных больше, чем все 1000:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (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=%d,sex=%s,income=%d" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

# 关闭数据库连接
db.close()

Результаты выполнения скрипта выше следующим образом:

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

обновление баз

Данные операции обновление для обновления таблицы данных, следующие примеры TESTDB поля таблицы Секс все изменения 'M', поле AGE увеличивается на 1:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用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()

делеция

Удаление данных удаления данных для таблицы, следующий пример демонстрирует удаление данных в таблице EMPLOYEE возрастов больше, чем все данные 20:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

# 关闭连接
db.close()

Исполнительные делам

Механизм транзакций для обеспечения целостности данных.

Услуги должны иметь четыре свойства: атомарность, согласованность, изоляция, долговечность. Эти четыре свойства часто называют свойствами ACID.

  • Atomic (атомарность). Сделка является неделимой единицей работы, такие операции включаются в транзакции либо делать или не делать.
  • Последовательность (концентрации). Услуги должны быть изменены, чтобы сделать базу данных из одного согласованного состояния в другое согласованное состояние. Последовательность и атомарность тесно связаны между собой.
  • Изоляция (изоляция). Выполнение транзакции не может быть другой транзакции помех. То есть внутренняя операция транзакций и использование других транзакций данных параллелизм изолируется и не могут мешать друг другу между отдельными сделками выполняться одновременно.
  • Стойкость (долговечность). Стойкие также называют постоянным (неизменность), это означает, что когда-то транзакция фиксируется, изменить свои данные в базе данных должны быть постоянными. Следующие другие операции или его отказ не должен иметь никакого влияния.

Python DB API 2.0 обеспечивает два способа фиксации транзакции или отката.

Пример:

# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 向数据库提交
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

Для транзакционной базы данных, программирование баз данных в Python, когда установлен курсор, автоматически начинает транзакцию базы данных невидимой.

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


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

DB API определяет некоторые ошибки и отклонения от нормы функционирования базы данных В следующей таблице перечислены эти ошибки и исключения.:

ненормальный описание
предупреждение Когда есть серьезное предупреждение для запуска, например, вставка данных усекается, и так далее. Это должен быть подкласс StandardError.
ошибка Все остальные, кроме предупреждений классы ошибок. Это должен быть подкласс StandardError.
InterfaceError Срабатывает, когда модуль интерфейса базы данных имеет свою собственную ошибку (вместо базы данных ошибок) происходит. Оно должно быть подклассом Error.
DatabaseError Запуск и ошибки базы данных, связанных с. Оно должно быть подклассом Error.
DataError Когда есть произошла ошибка обработки данных при запуске, например: деление на ноль ошибок, данные вне диапазона, и так далее. Это должен быть подкласс DatabaseError.
OperationalError Это относится к не-контролируемых пользователем, но произошла ошибка при базе данных. Например: случайно отключен, имя базы данных не найден, то сделка не удается, ошибка распределения памяти произошла ошибка базы данных и т.п. операции. Это должен быть подкласс DatabaseError.
IntegrityError Целостность-ошибки, связанные, например, внешнего ключа проверки не удается, и тому подобное. Он должен быть DatabaseError подкласс.
InternalError Внутренняя ошибка базы данных, такие как курсор (курсор), выходит из строя, синхронизация транзакций сбой и так далее. Он должен быть DatabaseError подкласс.
ProgrammingError Процедурные ошибки, такие как таблицы данных (таблица) не найдена или уже существует, ошибка синтаксиса SQL заявление, номер ошибки параметров, и так далее. Это должен быть подкласс DatabaseError.
NotSupportedError Не поддерживается ошибка, относится к использованию функций, таких как API или база данных не поддерживает. Например, при использовании .rollback на функции объекта подключения (), но база данных не поддерживает транзакции или сделка была закрыта. Это должен быть подкласс DatabaseError.