Блогирайте ги. толи
Python рецепти. Ние сме приятели с python и MySQL.
Причината за написването на тази статия беше необходимостта от гъвкава работа с доста голям набор от същия тип данни. Данните се представят като CSV файл и не е много удобно да се работи с него поради неговия размер (50 Mb) и формат (търсенето на отделен необходим запис може да отнеме 1-3 секунди). Затова беше решено да се импортира вбаза данни -MySQL.
За да работите сMySQL, трябва да инсталирате драйвер за работа с тази база данни за python: изтеглете модула MySQLdb, разопаковайте и инсталирайте. Тъй като използвам Ubuntu (което също ви съветвам), инсталирането ще се извърши с една команда:
$ sudo apt-get инсталирайте python-mysqldb
Време е да обясним принципите на работа с база данни в Python: свържете се с базата данни, създайте курсор (обект за работа с базата данни), изпълнете необходимите заявки, приложете промени в базата данни, затворете връзката с базата данни.
Да преминем към практиката. Има csv файл, всеки ред от който изглежда като „име; имейл; адрес; телефон” (например „Сергей Иванович; [email protected]; Москва, ул. Заречная 5, кв. 109″; 33-76-152). Имам mysql база данни bd с таблица с контакти. Скриптът по-долу ще изхвърли съдържанието на файла в базата данни.
По абсолютно същия начин можете да изтривате и актуализирате данни в базата данни: променя се само SQL заявката. Ситуацията е малко по-различна при вземането на проби от данни или по-скоро при обработката на информация, избрана от базата данни. След като изпълните заявка за извличане на данни с помощта на функцията на курсора fetchall(), можете да получите резултата от заявката. Той е представен като масив от записи, всеки от които е масив от съдържание на поле. За да не се объркате с полетата в SQL заявката, е необходимо да посочите избираемите полета и в товасъщия ред, за да ги извлечете от всеки запис.
Нека анализираме изпълнението и обработката на SELECT заявки, например: ще извлечем първите 10 потребители от новопопълнената база данни, чийто имейл се намира на Yandex.
Нека ви напомня още веднъж, че трябва да извлечете данни от запис в същия ред (и количество), в който са записани в SQL заявката.
Това е може би всичко. Ще се видим!
#1 от Константин на 10 декември 2010 - 10:45
Няколко въпроса за внедряването: 1) Не е ли кошер да се използва csv модулът за работа с csv файл? Това ще ви позволи да работите с всеки ред като речник, вместо да разчитате на реда на полетата във файла, и няма да е необходимо специално да филтрирате заглавния ред. 2) каква е ползата от използването на базата данни, ако пълният файл се прочете в листа, за да се постави в него?
благодаря за показването на LIMIT - ще знам, че има такъв специфичен за MySQL аналог на TOP.
#2 от toly на 10 декември 2010 г. - 10:51
Размерът на файла е 50 метра. Търсенето с най-малко количество RAM през MySQL е най-добрият вариант. В противен случай еднократно изпълнение на сценария, макар и за кратко, ще измине 50 метра. С MySQL няма да има такива проблеми. В допълнение, скриптът трябваше да се изпълнява на евтин VDS - не можете да хвърлите много RAM там.
Благодаря за обратната връзка.
#3 от procool на 17 март 2012 г. - 10:08
не става въпрос за това дали е добре или лошо да се използва базата данни, а по-скоро за това, че сте записали целия файл за въвеждане на базата данни в паметта .. без значение колко vds се задушава :)
#4 от bender на 10 февруари 2012 г. - 15:46
if string.find(line, "@") > -1 може лесно да се замени с: ако ‘@’ в ред:
#5 от toly на 14 декември 2012 г. - 12:23
Съгласен. четимостта на кода от това само ще бъде по-добра.
#6 от SoftDed на 30 март 2012 г. - 11:51
Благодаря много за съвета! Пренаписах половината от бойния си сценарий!
#7 от Solstice на 13 декември 2012 г. - 20:50
Защо има толкова много кавички в заявката /* sql = """SELECT mail, name FROM eadres WHERE mail LIKE ‘%yandex.ru’ LIMIT 10″"" */ ?
#8 от toly на 14 декември 2012 г. - 12:22
в python можете да използвате тройни кавички за обозначаване на низове
#9 от Andry на 19 декември 2012 г. - 8:53
Много благодаря за изчерпателния пример!
#10 от алексей на 10 януари 2013 г. - 12:27
Защо данните не се добавят към базата данни по време на операцията INSERT. Въпреки че идентификационният номер има активиран auto_incrment и се взема предвид, не се виждат данни. Не възникват грешки. И операторът select минава с гръм и трясък.
#11 от toly на 10 януари 2013 г. - 12:45
Мисля, че трябва да опитате да изпълните същия INSERT в конзолата за базата данни - може би ще даде грешка
#12 от алексей на 12 януари 2013 г. - 22:55
Не дава никакви грешки. Данните се добавят
#13 от алексей на 12 януари 2013 г. - 23:06
Въпросът е премахнат!) Забравих реда db.commit()
#14 от Dmitry на 18 юли 2013 г. - 12:37
Благодаря ви за статията! Имам въпрос, ако заявките се правят доста често и скриптът може да се промени по време на заявките, как можете да избегнете постоянните връзки към сървъра? Има ли някаква команда MySqldb за проверка на връзката?
#15 от toly на 18 юли 2013 г. - 15:04
когато приключите работата с базата данни, трябва да прекратите връзката. в този случай ще има една връзка за изпълнение на скрипт. Ако заявките се правят много често, тогава можете да използвате набор от връзки. Вече не работя с MySQL (както и с чист SQL). Много удобен ORM (SQLAlchemy или dzhangovsky) с postgresql. Препоръчвам.
#16 от Егор на 21Декември 2014 - 3:26
Много благодаря за статията. Седях дълго време и не можех да разбера защо не мога да го добавя към базата данни, а след това попаднах на вашата статия и разбрах, че не съм се ангажирал :) Въпреки че проверих заявката в конзолата на базата данни и повече не го направих. И много други функции, които взех от вас, за да оптимизирам кода)
#17 от Snowman8526 на 16 юни 2015 г. - 18:38
Интересувам се от тази тема. Когато правите нещо в phpMyAdmin, получавате обратно заявка за вписване, обработена за 0,0012 секунди. Планирам да направя тежък обмен на данни на моя слаб сървър и ще се интересувам както от отделни заявки, така и от цялостната работа на цикъла. Възможно ли е да се направи заявка за извеждане на тези данни? Или е по-лесно да използвате инструментите на phpMyAdmin? Но там не се вижда коя заявка зарежда системата и като новак в базата ще ми е трудно да разбера. Благодаря ти.
#18 от toly на 16 юни 2015 г. - 19:01
#19 от Snowman8526 на 17 юни 2015 г. - 17:38
Още един малък въпрос. След заявка SELECT, тя завърта за мен някои стойности като ((0,),) или ((u’qwe’,),),) как мога да получа чиста стойност? Опитах се да се отърва от конструкцията на типа (stroka.replace('((',"))), но след това разбрах, че това е тип кортеж, но не е кортеж. Какъв е този тип данни?
Разбирам, че вече не използвате sql, но може би сте срещали такъв проблем. Благодаря ви.
#20 от toly на 17 юни 2015 г. - 17:46
Това е кортеж с вложен кортеж. Ако е известно със сигурност, че ще бъде върната една стойност, тогава можете да я извикате така In [8]: a = ((1, ), ) In [9]: a[0][0] Out[9]: 1
#21 от Snowman8526 на 17 юни 2015 г. - 17:48