Python: работа с MySQL с использованием MySQLdb

Автор: | 13/08/2014

PythonПроверяем наличие модуля на примере из Python: ручная установка модулей на примере Psutil:

>>> imp.find_module("MySQLdb")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named MySQLdb

Если не найден – устанавливаем:

# pip install MySQL-python

В случае ошибки “InstallationError” – смотрим тут: CentOS: pip install MySQL-python — InstallationError.

Другой вариант – установить модуль вручную со страницы http://sourceforge.net/projects/mysql-python.

Создадим тестовую базу:

mysql> create database setevoy_test;
Query OK, 1 row affected (0.01 sec)
mysql> grant all on setevoy_test.* to 'setevoy'@'%';
Query OK, 0 rows affected (0.05 sec)

Первый пример – выполнение простого запроса и получение версии MySQL:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import MySQLdb

# создаём подключение с помощью метода Connect
db = MySQLdb.connect("localhost","setevoy","pass")

# создаём объект db с помощью метода cursor() модуля MySQLdb
cursor = db.cursor()

# выполняем SQL запрос с помощью метода execute()
cursor.execute("select version()")

# предыдущая строка возвращает объект класса Connection;
# выполним метод fetchone для получения одной строки
# или fetchall для получения всех
data = cursor.fetchone()

print "Версия MySQL : %s " % data

# и отключаемся от сервера
db.close()

Запускаем:

$ ./mysql.py
Версия MySQL : 5.1.73

Получение подсказки по функциям, например с помощью pydoc:

$ pydoc MySQLdb
...
PACKAGE CONTENTS
connections
constants (package)
converters
cursors
release
times
...
$ pydoc MySQLdb.connections

Или вызовом help(MySQLdb) в самом скрипте или из консоли интерпетатора:

>>> import MySQLdb
>>> help(MySQLdb)

Усложним скрипт, и добавим в него создание базы и просмотр имеющихся таблиц:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import MySQLdb

# есть упоминания о том, что некоторые версии MySQLdb
# после выполнения db.close не полностью "убирают мусор"
# добавим вызов garbage collector
import gc

# создаём подключение с помощью метода Connect
# тут с помощью init_command указываем первое действие, которое надо выполнить после подключения
# но для выбора базы - правильнее использовать db="databasename", init_command тут для примера
db = MySQLdb.connect(host="localhost", user="setevoy", passwd="pass", init_command="use setevoy_test")

# создаём объект db с помощью метода cursor() модуля MySQLdb
cursor = db.cursor()

# выполняем SQL запрос с помощью метода execute()
cursor.execute("select version()")

# предыдущая строка возвращает объект класса Connection;
# выполним метод fetchone для получения одной строки
data = cursor.fetchone()

print "Версия MySQL : %s " % data

# удалим таблицу, если уже есть
cursor.execute("drop table if exists testtable")

# для коротких запросов из можно можно записать в аргументы к execute
# длинный запрос - удобнее поместить в переменную
# создаём переменную с запросом
sql = """create table testtable(firstcol char(20) not null, secondcol char(20), intcol int)"""

# выполняем запрос
cursor.execute(sql)

# проверим таблицы
cursor.execute("show tables")

print "Так:"
for data in cursor:
  print data[0]

print "Или так:"
tables = cursor.fetchall()
print tables

# и отключаемся от сервера
db.close()

# вызываем garbage collector
gc.collect()

Пример выполнения INSERT:

Посмотрим базу сейчас:

mysql> use setevoy_test;
Database changed

mysql> show tables;
+------------------------+
| Tables_in_setevoy_test |
+------------------------+
| testtable |
+------------------------+
1 row in set (0.06 sec)

mysql> desc testtable;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| firstcol | char(20) | NO | | NULL | |
| secondcol | char(20) | YES | | NULL | |
| intcol | int(11) | YES | | NULL | |
+-----------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

Обычный запрос будет вылядеть так:

mysql> insert into testtable(firstcol, secondcol, intcol) values ('firstline', 'secondline', '100');
Query OK, 1 row affected (0.00 sec)

mysql> select * from testtable;
+-----------+------------+--------+
| firstcol | secondcol | intcol |
+-----------+------------+--------+
| firstline | secondline | 100 |
+-----------+------------+--------+
1 row in set (0.00 sec)

Добавим этот запрос в скрипт:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import MySQLdb
import gc

# создаём подключение с помощью метода Connect
# передаём имя базы через db="" вместо init_command=
db = MySQLdb.connect(host="localhost", user="setevoy", passwd="pass", db="setevoy_test")

# создаём объект db с помощью метода cursor() модуля MySQLdb
cursor = db.cursor()

# добавим обработку ошибок
try:
  # создаём переменную с запросом
  insert = """insert into testtable(firstcol, secondcol, intcol) values ('newline', 'newline', '100')"""

  # выполняем запрос
  cursor.execute(insert)

  cursor.execute("select * from testtable")

  # используем fetchall() вместо fetchone()
  # что бы получить все данные
  # а не только последнюю строку
  data = cursor.fetchall()
  print data

# добавим обработку ошибок
except MySQLdb.Error as e:
  print "MySQL Error [%d]: %s" % (e.args[0], e.args[1])

else:
# и отключаемся от сервера
  db.close()
  gc.collect()

Запускаем:

$ ./mysql.py
(('newline', 'newline', 100L),)

И что бы посмотреть результат работы fetchall() – запустим ещё раз:

$ ./mysql.py
(('newline', 'newline', 100L), ('newline', 'newline', 100L))

Для множественного добавления данных – используем executemany().

Создадим список, в котором будет четыре кортежа:

>>> putit = [('line1', 'line2', 1), ('line3', 'line4', 2), ('line5', 'line6', 3), ('line7', 'line8', 4)]
>>> putit = [
... ('line1', 'line2', '1'),
... ('line3', 'line4', '2'),
... ('line5', 'line6', '3'),
... ('line7', 'line8', '4')
... ]
>>> type(putit)
<type 'list'>
>>> type(putit[1])
<type 'tuple'>

Редактируем скрипт:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import MySQLdb
import gc

# создаём подключение с помощью метода Connect
db = MySQLdb.connect(host="localhost", user="setevoy", passwd="liBerty911", db="setevoy_test")

# создаём объект db с помощью метода cursor() модуля MySQLdb
cursor = db.cursor()

try:

  # создаём список, котрый содержит кортежи
  putit = [
  ('line1', 'line2', '1'),
  ('line3', 'line4', '2'),
  ('line5', 'line6', '3'),
  ('line7', 'line8', '4')
  ]

  # создаём переменную с запросом, где в VALUES передаём форматирование строки %s
  insert = """insert into testtable(firstcol, secondcol, intcol) values (%s, %s, %s)"""

  # выполняем запрос, вторым аргументом к executemany передаём наш словарь
  print "Выполянем запрос INSERT..."
  cursor.executemany(insert, putit)

  print "Выполняем SELECT, что бы посмотреть результат: "
  cursor.execute("select * from testtable")
  data = cursor.fetchall()
  print data

except MySQLdb.Error as e:
  print "MySQL Error [%d]: %s" % (e.args[0], e.args[1])

else:
# и отключаемся от сервера
  db.close()
  gc.collect()

Запускаем:

$ ./mysql.py
Выполянем запрос INSERT...
Выполняем SELECT, что бы поcмотреть результат:
(('line1', 'line2', 1L), ('line3', 'line4', 2L), ('line5', 'line6', 3L), ('line7', 'line8', 4L))

Ссылки по теме

http://zetcode.com
http://ianhowson.com
http://webonrails.ru
http://www.tutorialspoint.com