
Shop brand android tablet pc at low price on DHgate.com
Поль Дюбуа paul@kitebird.com [1]
Документ перегляду: 1.02
Останнє оновлення: 2006-09-17
Python є одним з найбільш популярних мов програмування відкритого джерела, в основному через свою рідну виразність, а також різних допоміжних модулів, які можна розширити її можливості. Одним з таких модулів є DB-API, який, як випливає з назви, надає програмний інтерфейс програми баз даних. DB-API призначений для відносно самостійних деталей, характерні для будь-якої бази даних, які допоможуть вам написати доступу до бази даних скриптів, які переносяться між системами.
Дизайн DB-API подібний тому, який використовується Perl та Ruby DBI модуля, PHP PEAR DB клас і інтерфейс Java JDBC: він використовує дворівневу архітектуру, в якій на верхньому рівні надає абстрактний інтерфейс, який однаковий для всіх підтримуваних СУБД, а також більш низький рівень, що складається з драйверів для конкретних двигунів, які займаються двигуна залежить від деталей. Це означає, що, звичайно, використовувати DB-API для написання скриптів Python, ви повинні мати драйвер для вашої системи баз даних. Для MySQL, DB-API забезпечує доступ до баз даних за допомогою MySQLdb водія. Цей документ починається з обговорення установки драйверів (у випадку, якщо у вас немає MySQLdb), потім переходить до розповім, як писати DB-API сценаріїв.
Для запису MySQL скриптів, які використовують DB-API, Python сам повинен бути встановлений. Це майже напевно буде вірно, якщо ви використовуєте Unix, але це менш імовірно, для Windows. Установники для будь-якої платформи можна знайти на сайті Python Інтернет (див. розділ "Ресурси" в кінці цього документа).
Переконайтеся, що ваша версія Python є 2.3.4 або пізнішої версії, а також, що модуль MySQLdb встановлений. Ви можете перевірити, як ці вимоги, запустивши Python в інтерактивному режимі з командного рядка (щось на зразок % для Unix або C: \> для Windows):
% python Python 2.4.3 (#1, Aug 29 2006, 14:45:33) [GCC 3.4.6 (Gentoo 3.4.6-r1, ssp-3.4.5-1.0, pie-8.7.9)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import MySQLdb
Припускаючи, що у вас достатньо свіжа версія Python і що помилка виникає, коли ви виконаєте імпорт MySQLdb
заяву, ви готові приступити до написання доступу до бази даних скриптів і ви можете переходити до наступного розділу. Однак, якщо ви отримуєте повідомлення про помилку, необхідно отримати і встановити MySQLdb перший:
>>> import MySQLdb
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ImportError: No module named MySQLdb
Для отримання MySQLdb, відвідайте розділі «Ресурси», щоб побачити, де отримати розподіл підходить для вашої системи. Попередньо скомпільовані бінарні файли можуть для вашої платформи, або ви можете встановити з вихідних текстів. Якщо ви використовуєте бінарний дистрибутив, встановіть його за допомогою звичайної установки пакета для вашої платформи процедури. Для побудови та встановлення з початкових кодів, перейти в каталог верхнього рівня в MySQLdb розподілу та видачі наступних команд. (Під Unix, цілком імовірно, що вам потрібно, щоб запустити другу команду, як корінь, так що файли драйвера можна скопіювати в ваш Python установки).
% python setup.py build % python setup.py install
Якщо у вас виникли проблеми, зверніться до README файл в комплекті з MySQLdb розподілу.
Сценарії, в яких доступ до MySQL через DB-API за допомогою MySQLdb як правило, виконують такі дії:
Частина цього розділу є короткий DB-API сценарій, який демонструє основні елементи цих кроків. У наступних розділах обговорюються конкретні аспекти написання сценарію більш докладно.
Використовуйте текстовий редактор, щоб створити файл з ім'ям server_version.py
, який містить наступний сценарій. Цей сценарій використовує MySQLdb для взаємодії з сервером MySQL, хоча і в порівняно елементарний мода - все це робить, запитайте сервера для версії рядки:
# server_version.py - retrieve and display database server version
import MySQLdb
conn = MySQLdb.connect (host = "localhost",
user = "testuser",
passwd = "testpass",
db = "test")
cursor = conn.cursor ()
cursor.execute ("SELECT VERSION()")
row = cursor.fetchone ()
print "server version:", row[0]
cursor.close ()
conn.close ()
Імпорт заяви говорить Python, що сценарій необхідно використовувати код в модуль MySQLdb. Ця заява має передувати будь-якій спробі підключення до сервера MySQL. Після встановлення з'єднання при виклику connect () метод MySQLdb водій з відповідними параметрами підключення. . Вони включають в себе ім'я хоста, де запущений сервер, ім'я користувача і пароль для облікового запису MySQL, і ім'я бази даних, які ви хочете використовувати connect () Синтаксис списку аргументів варіює серед водіїв, для MySQLdb, аргументи можуть бути наведені в
ім'я = значення . формат, який має ту перевагу, що ви можете задати їх в будь-якому порядку
server_version.py встановлює з'єднання з сервером MySQL на локальній машині, щоб отримати доступ до тест бази даних з ім'ям користувача і паролем TestUser і testpass :
conn = MySQLdb.connect (host = "localhost",
user = "testuser",
passwd = "testpass",
db = "test")
Якщо connect () буде успішним, він повертає об'єкт підключення, який служить основою для подальшої взаємодії з MySQL. Якщо виклик не вдається, він викликає виключення. ( server_version.py
не обробляє виключення, так що помилки на даний момент завершує сценарій. обробка помилок розглядається далі в цьому документі).
Після підключення об'єкта був отриманий, server_version.py
викликає його курсором () метод для створення об'єкту курсора для обробки заяв. Цей сценарій використовує цей курсор видати SELECT, VERSION () заяву, яка повертає рядок, що містить інформацію про сервер версії:
cursor = conn.cursor ()
cursor.execute ("SELECT VERSION()")
row = cursor.fetchone ()
print "server version:", row[0]
cursor.close ()
Курсор об'єкта execute () метод відправляє заяву на сервер і fetchone () повертає рядок у кортеж. У заяві, показаному тут, кортеж містить одне значення, яке відбитки сценарій. (Якщо ні один рядок є, fetchone ()
фактично повертає значення None, server_version.py
безтурботно припускає, що цього не відбудеться, припускаючи, що ви зазвичай не слід робити в наступних прикладах, ми будемо обробляти цей випадок.). Курсор об'єкти можуть використовуватися для видачі декількох операторів, але server_version.py більше немає необхідності курсор
після отримання версії рядки, що закриває його.
Нарешті, сценарій викликає підключення об'єкта Close ()
метод для відключення від сервера:
conn.Close ()
Після цього, з'єднання стають недійсними і не повинні використовуватися для доступу до сервера.
Для виконання server_version.py сценарій, викличте Python з командного рядка і повідомити йому ім'я скрипта. Ви побачите результат щось на зразок цього:
% python server_version.py server version: 5.1.12-beta-log
Це означає, що версія MySQL сервер 5.1.12, бета
і журналу суфікси Повідомте нам про рівень розподілу стабільності, і що запит включено ведення журналу. (Ви можете подивитись інші суфікси, ніж показано тут. Наприклад, якщо ви включеної налагодженням, ви побачите , налагодження суфікс).
Цілком можливо, створити сценарій, так що вона може бути запущена на ім'я без залучення Python в явному вигляді. В Unix, додати початкові
#! лінії сценарій, який визначає повний шлях до файлу інтерпретатора Python. Це говорить системі, що програма повинна виконати сценарій. Наприклад, якщо Python життя в / USR / бен / Python
на вашій системі, додати в якості першого рядка скрипта:
#!/usr/bin/python
Потім за допомогою CHMOD, щоб зробити скрипт виконуваним, і ви зможете запустити її прямо:
% CHMOD + х server_version.py % . / server_version.py
(Ведучий " . / "говорить ваш командний інтерпретатор явно, що сценарій знаходиться в поточному каталозі. Багато Unix рахунку створюються не для пошуку в поточній директорії при пошуку команди.)
Під Windows, #! лінія є необхідним (хоча це нешкідливо, так що вам не потрібно видаляти, якщо Ви пишете скрипт на системи Unix, а потім перемістити його у вікно Windows). Замість цього, ви можете створити файл, так що асоціації . ру скрипти будуть пов'язані з Python. Замість того щоб використовувати CHMOD, щоб зробити скрипт виконуваним, відкрийте пункт Властивості папки в панелі управління і виберіть її типи файлів вкладки. Типи файлів дозволяє створити асоціацію для файлів, які закінчуються . ру сказати Windows, виконувати їх з Python. Потім ви можете викликати сценарій за назвою:
C: \> server_version.py
При установці ActiveState Python на Windows, установки ActiveState встановлює зв'язок автоматично, як частина процесу установки.
server_version.py має ряд недоліків. Наприклад, не ловить виключення або вказати, що пішло не так, якщо відбулася помилка, і вона не допускає можливості, що заяву він працює, можливо, не дав ніяких результатів. Даний розділ показує, як вирішити ці проблеми, використовуючи більш складний сценарій, animal.py, який використовує таблицю, яка містить назви тварин і категорії:
CREATE TABLE animal
(
name CHAR(40),
category CHAR(40)
)
Якщо ви читали документ PEAR DB доступні на сайті Kitebird (див. розділ "Ресурси"), ви можете побачити цю таблицю, і деякі з заяв, зроблених animal.py, вони були використані в цьому документі, також.
Animal.py скрипт починається так (у тому числі ! #
лінію, якщо ви збираєтеся запускати скрипт на системи Unix):
#!/usr/bin/python # animal.py - create animal table and # retrieve information from it import sys import MySQLdb
Як server_version.py, MySQLdb скрипт імпорту, а й імпортує системи модулів для використання в обробці помилок. ( animal.py використовує sys.exit (), щоб повернутися 1 для індикації аварійного завершення в разі виникнення помилки.)
Після імпорту необхідних модулів, animal.py встановлює з'єднання з сервером за допомогою connect () виклику. Для забезпечення можливості зв'язку відмови (наприклад, так що ви можете відобразити причину невдачі), це необхідно для перехоплення виключень. Для обробки виключень в Python, помістити ваш код в спробі заяву і включають в себе , крім
пункту, який містить код обробки помилок. В результаті з'єднання послідовність виглядає наступним чином:
try:
conn = MySQLdb.connect (host = "localhost",
user = "testuser",
passwd = "testpass",
db = "test")
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit (1)
За винятком пункту імен класу виключення ( MySQLdb.Error
в цьому прикладі), щоб отримати від бази даних інформацію про помилки, які можуть забезпечити MySQLdb, а також змінну ( E ), в якій для зберігання інформації. Якщо відбувається виключення, MySQLdb робить цю інформацію доступною в e.args, з двох елементів кортеж, що містить числовий код помилки і рядок з описом помилки. За винятком пункту показано на прикладі друкується обидва значення і виходи.
Будь база даних, пов'язаних заяви можуть бути поміщені в аналогічну спробу / за винятком
структури пастку і повідомлення про помилки, для стислості, наступне обговорення не показує код обробки винятків. (Повний текст animal.py перерахованих у Додатку).
У наступному розділі animal.py створюється курсор об'єкт і використовує його для видачі заяви, які створені і заповнити тваринами
таблиці:
cursor = conn.cursor ()
cursor.execute ("DROP TABLE IF EXISTS animal")
cursor.execute ("""
CREATE TABLE animal
(
name CHAR(40),
category CHAR(40)
)
""")
cursor.execute ("""
INSERT INTO animal (name, category)
VALUES
('snake', 'reptile'),
('frog', 'amphibian'),
('tuna', 'fish'),
('racoon', 'mammal')
""")
print "Number of rows inserted: %d" % cursor.rowcount
Зверніть увагу, що цей код не містить помилок. (Пам'ятаєте, що він буде розміщений в спробі затвердження; помилки будуть викликати виключення, які спіймали й обробляються у відповідній за винятком
пункту, який дозволяє основний потік код для читання більш гладко.) заяви виконайте наступні дії:
Кожне твердження видається при виклику курсор об'єкта execute ()
метод. Перші два твердження не дають результату, а третій виробляє граф із зазначенням кількості вставлених рядків. Кількість доступний в курсора рядків атрибутів. (Деякі бази даних інтерфейси забезпечують цей рахунок як значення, що повертається заяву, виконання виклику, але це не вірно для DB-API).
Тварина таблиця налаштована на даний момент, тому ми можемо видати
SELECT, заяви для отримання інформації з нього. Як і в попередніх заявах, SELECT, заяви видаються використанні execute () . Однак, на відміну від таких заяв, як DROP або INSERT, SELECT, заяви створення результуючого набору, що ви повинні отримати. Тобто, execute ()
тільки питання, заяви, він не повертає набір результатів. Ви можете використовувати fetchone (), щоб отримати рядки по одному або fetchall (), щоб отримати їх всі одразу. animal.py
використовуються обидва підходи. Ось як можна використовувати fetchone () для рядків за один раз пошук:
cursor.execute ("SELECT name, category FROM animal")
while (1):
row = cursor.fetchone ()
if row == None:
break
print "%s, %s" % (row[0], row[1])
print "Number of rows returned: %d" % cursor.rowcount
fetchone () повертає наступний рядок з результуючого набору, як кортеж, або значення None, якщо рядів більше немає доступних. Цикл перевіряє це і виходить, коли результуючий набір вичерпаний. Для кожного рядка повернувся, кортеж містить два значення (це скільки стовпців SELECT, оператор попросив), який animal.py відбитків. Друк заяву було показано вище доступ до окремих елементів кортежу. Однак, оскільки вони використовуються в порядку входження в кортеж, друку
заява може точно так же було написано так:
print "%s, %s" % row
Після виведення заяви результаті, сценарій також виводить кількість рядків, повернутих (доступна як значення рядків
атрибутів).
fetchall () повертає весь набір результатів відразу, як кортеж кортежів або порожній кортеж, якщо результуючий набір порожній. Щоб отримати доступ до окремих наборам рядків, ітерацію рядків встановлено, що fetchall () повертає:
cursor.execute ("SELECT name, category FROM animal")
rows = cursor.fetchall ()
for row in rows:
print "%s, %s" % (row[0], row[1])
print "Number of rows returned: %d" % cursor.rowcount
Цей код виводить кількість рядків, звертаючись рядків, як і для fetchone () цикл. Інший спосіб визначити кількість рядків, коли ви використовуєте fetchall (), взявши довжину значення, що вона повертає:
print "%d rows were returned" % len (rows)
Отримати петель показані досі отримати рядків, кортежів. Крім того, можна витягти рядки як словники, яка дозволяє отримати доступ до значень стовпця по імені. Наступний код показує, як це зробити. Зверніть увагу, що словник доступ вимагає різного роду курсора, так що приклад закриває курсор і отримує новий, який використовує інший клас курсора:
cursor.close ()
cursor = conn.cursor (MySQLdb.cursors.DictCursor)
cursor.execute ("SELECT name, category FROM animal")
result_set = cursor.fetchall ()
for row in result_set:
print "%s, %s" % (row["name"], row["category"])
print "Number of rows returned: %d" % cursor.rowcount
NULL значень результуючий набір повертається як ні
в вашій програмі.
MySQLdb підтримує заповнювача можливість, яка дозволяє пов'язувати дані значення для спеціальних маркерів у звіті рядки. Це є альтернативою вкладення значення безпосередньо в заяві. Прототип механізм обробляє додавання лапки значень даних, і він уникає будь-яких спеціальних символів, які відбуваються в межах значень. Наступні приклади показують, UPDATE
заяву, яка змінює змія на черепасі, спочатку за допомогою буквального значення, а потім за допомогою заповнювачів. Буквальне значення заява виглядає наступним чином:
cursor.execute ("""
UPDATE animal SET name = 'turtle'
WHERE name = 'snake'
""")
print "Number of rows updated: %d" % cursor.rowcount
Крім того, ви можете оформити заяву ж за допомогою % з
заповнювачем маркерів і пов'язує відповідні їм значення:
cursor.execute ("""
UPDATE animal SET name = %s
WHERE name = %s
""", ("snake", "turtle"))
print "Number of rows updated: %d" % cursor.rowcount
Зверніть увагу на наступні моменти, що стосуються форми попереднього execute ()
по телефону:
Після видачі заяви, animal.py закриває курсор, фіксує зміни і відключається від сервера:
cursor.close () conn.commit () conn.Close ()
Об'єкт підключення фіксації () метод здійснює будь-які додаткові зміни до поточної транзакції, щоб зробити їх постійними в базі даних. В DB-API, з'єднання починається з режимі автоматичної фіксації відключений, так що ви повинні викликати commit () перед відключенням або зміни можуть бути втрачені.
Якщо тварина таблиця є таблицею MyISAM, commit ()
не має ніякого ефекту: MyISAM не є транзакційний механізм зберігання, тому зміни в MyISAM таблиці вступають в силу негайно, незалежно від автоматичному режимі. Однак, якщо тварина використовує транзакційний механізм зберігання InnoDB, такі як, відсутність виклику commit ()
призводить до неявній відкат транзакції при відключенні. Наприклад, якщо ви додасте ENGINE = InnoDB в кінці
CREATE TABLE заяву і зняти commit ()
виклик в кінці скрипта, ви виявите, що тварина
є порожнім після виконання сценарію.
Для сценаріїв, які тільки отримують дані, ніяких змін не повинні бути вчинені і commit () не є необхідним.
Якщо ви хочете перенести MySQLdb основі DB-API сценарію для використання в іншій базі даних, джерела не-переносимості відбутися в будь-якому місці, що ім'я драйвера можуть бути використані:
Інший тип не-переносимості, що не тягне за собою ім'я драйвера стосується використання заповнювачів. DB-API специфікація дозволяє протягом декількох синтаксису вставки, а деякі водії використовують синтаксис, який відрізняється від того, підтримується MySQLdb.
Сценарії, які використовуються для прикладів у цьому документі може бути завантажена за наступною адресою:
http://www.kitebird.com/articles/ [2]
Ви можете знайти додаткові ресурси, корисні для використання Python DB-API і драйвера MySQLdb:
http://dustman.net/andy/python/~~V [3]
Цей сайт є найкращим місцем, щоб прочитати MySQLdb документації та FAQ в Інтернеті. Він також містить посилання на дистрибутиви Debian і Windows, бінарний. Щоб отримати вихідний код або Linux RPM, відвідати сховища MySQLdb SourceForge за адресою:
http://sourceforge.net/projects/mysql-python [4]
http://www.kitebird.com/mysql-cookbook [5]http://www.oreilly.com/catalog/mysqlckbk/ [6]
http://www.python.org/~~V [7]
http://www.python.org/sigs/db-sig/~~V [8]
http://www.kitebird.com/articles/ [9]
Ви можете знайти це повчально порівняти цей документ з цим, щоб побачити, як DB-API і PEAR DB схожі або різні в своїх підходах до баз даних.
Повний вихідний код для animal.py сценарію показано тут:
#!/usr/bin/python
# animal.py - create animal table and
# retrieve information from it
import sys
import MySQLdb
# connect to the MySQL server
try:
conn = MySQLdb.connect (host = "localhost",
user = "testuser",
passwd = "testpass",
db = "test")
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit (1)
# create the animal table and populate it
try:
cursor = conn.cursor ()
cursor.execute ("DROP TABLE IF EXISTS animal")
cursor.execute ("""
CREATE TABLE animal
(
name CHAR(40),
category CHAR(40)
)
""")
cursor.execute ("""
INSERT INTO animal (name, category)
VALUES
('snake', 'reptile'),
('frog', 'amphibian'),
('tuna', 'fish'),
('racoon', 'mammal')
""")
print "Number of rows inserted: %d" % cursor.rowcount
# perform a fetch loop using fetchone()
cursor.execute ("SELECT name, category FROM animal")
while (1):
row = cursor.fetchone ()
if row == None:
break
print "%s, %s" % (row[0], row[1])
print "Number of rows returned: %d" % cursor.rowcount
# perform a fetch loop using fetchall()
cursor.execute ("SELECT name, category FROM animal")
rows = cursor.fetchall ()
for row in rows:
print "%s, %s" % (row[0], row[1])
print "Number of rows returned: %d" % cursor.rowcount
# issue a statement that changes the name by including data values
# literally in the statement string, then change the name back
# by using placeholders
cursor.execute ("""
UPDATE animal SET name = 'turtle'
WHERE name = 'snake'
""")
print "Number of rows updated: %d" % cursor.rowcount
cursor.execute ("""
UPDATE animal SET name = %s
WHERE name = %s
""", ("snake", "turtle"))
print "Number of rows updated: %d" % cursor.rowcount
# create a dictionary cursor so that column values
# can be accessed by name rather than by position
cursor.close ()
cursor = conn.cursor (MySQLdb.cursors.DictCursor)
cursor.execute ("SELECT name, category FROM animal")
result_set = cursor.fetchall ()
for row in result_set:
print "%s, %s" % (row["name"], row["category"])
print "Number of rows returned: %d" % cursor.rowcount
cursor.close ()
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit (1)
conn.commit ()
conn.close ()
Оригінальна версія цього документа була написана для корпорації NuSphere. Поточна версія оновленої ревізії оригіналу.