Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Как подружить Python с MySQL

Как подружить Python с MySQL

К написанию данной статьи меня подтолкнула надобность гибкой работы с весьма немалым количеством данных одного типа. Оформлены они в CSV-файл, работать с ним из-за размера (50 Мб) и такого формата (чтобы найти одну единственную строчку нужно потратить 1-3 секунды) довольно некомфортно. Чтобы сделать работу более удобной решил превратить это файл в базу данных MySQL.

Чтобы с ней можно было работать нужен специальный драйвер для Python. Поэтому, загружаем, распаковываем и устанавливаем модуль MySQLdb. У меня на компьютере установлена ОС Ubuntu (вам тоже рекомендую ее попробовать), поэтому воспользуемся следующей командой:

sudo apt-get install python-mysqldb

Если вы предпочитаете использовать Windows или собирать все самостоятельно из исходников, то найдете все нужное по ссылке - http://sourceforge.net/projects/mysql-python/files/

Теперь разберем, как будет осуществляться работа с этой базой данных на Python. Соединяемся с БД, создаем курсор (это объект для работы с БД), делаем нужные запросы, применяем внесенные изменения, прекращаем соединение с базой.

Попробуем на практике. У нас имеется csv-файл, каждая строчка которого приведена к следующему виду: «name;email;address;phone» (к примеру, «Петр Петрович;mail@mail.com;Тюмень, ул. Новоселовская 10, кв. 35;52-56-118). Имеется база данных mysql bd с табличкой contacts. С помощью указанного ниже скрипта все данные из файла будут импортированы в базу данных.

 #!/usr/bin/python
# -*- coding: utf-8
 
import MySQLdb
import string
 
# распаковка строки, в которой поля записаны с разделителем ";"
def unpack_line(line):
    line = string.replace(line, "'", "")
    els = string.split(line, ";")
    # выделяем имя, емейл, адрес и телефон
    fname = els[0]
    fmail = els[1]
    fadres = els[2]
    ftel = els[3]
    return fname, fmail, fadres, ftel
 
# подключаемся к базе данных (не забываем указать кодировку, а то в базу запишутся иероглифы)
db = MySQLdb.connect(host="localhost", user="root", passwd="пароль", db="contacts", charset='utf8')
# формируем курсор, с помощью которого можно исполнять SQL-запросы
cursor = db.cursor()
 
# открываем исходный csv-файл
f = open("log", "r")
# представляем его в виде массива строк
lines = f.readlines()
 
for line in lines:
    # если в строе присутствует емейл (определяем по наличию "@")
    if string.find(line, "@") > -1:
        # извлекаем данные из строки
        fname, fmail, fadres, ftel = unpack_line(line)
        # подставляем эти данные в SQL-запрос
        sql = """INSERT INTO contacts(name, mail, adres, tel)
        VALUES ('%(name)s', '%(mail)s', '%(adres)s', '%(tel)s')
        """%{"name":fname, "mail":fmail, "adres":fadres, "tel":ftel}
        # исполняем SQL-запрос
        cursor.execute(sql)
        # применяем изменения к базе данных
        db.commit()
 
# закрываем соединение с базой данных
db.close()
# закрываем файл
f.close()

Так же самом мы можем обновлять и удалять информацию в базе: поменяется лишь SQL-запрос. Если нужно сделать выборку, а конкретнее обработать выбранную из БД информацию, то делать нужно немного не так. После осуществления запроса по выборке данных посредством функции курсора fetchall() мы можем получить результат. Выводиться он будет как массив записей, где каждая из них это массив содержимого полей. Дабы в этих полях не потеряться нужно указать в SQL-запросе выбираемые поля, и в этом же порядке доставать их с каждой записи.

Возьмем такой пример по реализации и обработке SELECT-запросов: из базы, которую только что создали извлекаем первых десятерых пользователей, у которых яндексовская электронная почта.

 #!/usr/bin/python
# -*- coding: utf-8
 
import MySQLdb
import string
 
# соединяемся с базой данных
db = MySQLdb.connect(host="localhost", user="root", passwd="пароль", db="contacts", charset='utf8')
# формируем курсор
cursor = db.cursor()
 
# запрос к БД
sql = """SELECT mail, name FROM eadres WHERE mail LIKE '%yandex.ru' LIMIT 10"""
# выполняем запрос
cursor.execute(sql)
 
# получаем результат выполнения запроса
data =  cursor.fetchall()
# перебираем записи
for rec in data:
    # извлекаем данные из записей - в том же порядке, как и в SQL-запросе
    mail, name = rec
    # выводим информацию
    print name, mail
 
# закрываем соединение с БД
db.close()

И главное не забывайте, что порядок извлечения записей должен совпадать с тем, как они располагаются в самом SQL-запросе.

Нужны качественные Ph-метры для измерения свойств жидкостей? Тогда заходите на сайт http://www.kz.all.biz/ph-metry-karmannye-bgg1071158. Здесь вы найдете отличные Ph-метры, которые позволяют измерять кислотно щелочной баланс жидкостей и показывают наиболее точные результаты. Устройства позволяют быстро и точно узнать необходимые параметры.

Комментариев: 4
  1. Александр | 2015-06-13 в 09:53:03

    Меня интересует такая тема. Когда делаешь что-то в phpMyAdmin вам возвращается надпись запрос обработан за 0.0012 сек. Я планирую делать на моём слабеньком сервере нагруженный обмен данными и меня будет интересовать как отдельные запросы, так и общее работа цикла. Можно ли делать запрос на вывод этих данных? Или проще использовать средства phpMyAdmin? Но там не видно какой запрос грузит систему, а мне как новичку в БД будет сложно понять. Спасибо.

  2. Я начинаю изучать Python. Запрос SQL вернул результат (0L, 79L, 0L, 2L, 3L, 1L). Что такое L? Спасибо.

  3. Здравствуй Сергей.

    L это сокращенное от английского Long. То есть все данные которые имеют тип int возвращаются базой данной как Long, то есть они могут быть большого размера.

    Это так объект добавляет букву L с помощью метода класса __str__ или __repr__. Когда вы инициализируете переменную допустим с первым элементом из вашего списка (0L, 79L, 0L, 2L, 3L, 1L), то, буква L попросту исчезнет.

  4. Виктор | 2020-05-10 в 18:55:52

    Добрый день.

    А что делает данная строчка, для чего производится замена

    line = string.replace(line, "'", "")

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

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

(обязательно)