MySQL & mSQL

Динамическое соединение с базами данных


Тот метод API, который мы до сих пор обсуждали в этой главе, дает, в сущности, все необходимое для простых и наиболее часто встречающихся повседневных задач выборки, вставки, обновления и удаления данных в базе. В некоторых более сложных приложениях может оказаться, что вы ничего (или чего-нибудь) не знаете о базе данных, с которой соединяетесь и которой посылаете команды. Хотя оба API поддерживают метаданные уровня базы данных - информацию времени выполнения о базе данных, с которой соединены, - только MySQL API обеспечивает полную поддержку динамически генерируемых вызовов SQL, включая метаданные результирующего набора.

Описатели команд в MySQL

Как уже отмечалось, в MySQL есть два средства обработки запросов. Более простая форма возвращает результирующий набор в виде списка списков. Более сложная форма возвращает описатель команды.

Описатель команды представляет результаты обработки запроса к MySQL через метод query() (в противоположность использованию метода do()). Пример 11-2 показывает, как можно использовать описатель команды для получения информации времени выполнения о запросе или команде обновления.

Пример 11-2. Динамический доступ к базе данных MySQL с помощью описателя команды

[7:20pm] athens> python

Python 1.5.1 (#1, Jun 13 1998, 22:38:15) [GCC 2.7.2] on- sunos5

Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam

>>> import MySQL;

>>> db = MySQL,con.nect();

>>> db.selectdb('db_test-);

>>> result - db.query("INSERT INTO test(test_id,test_val) VALUES(4,

'Bing!')");



>>> print result.affectedrows();

1

>>> result = db.query("SELECT * FROM test");

>>> print result. numrows();

3

>>> print result.fields();

[['test_id', 'test', 'long', 11, 'notnull'], ['test_val', 'test', 'string',

100, "]]

>>> print result, fetchrows(-l);

[[1, 'This is a test.'], [2, 'This is a test.'], [4. 'Bing!']]

>>>

В дополнение к результирующему набору запроса можно с помощью описателя команды получить число строк, затронутых операциями обновления, вставки или удаления. В примере 11-2 мы получили количество строк, возвращенных запросом, и подробные сведения о колонках, представленных в результирующем наборе.


Из новых методов, появившихся в примере 11-2, только fetchrows() не является самоочевидным. Этот метод получает очередную группу строк в количестве, определяемом переданным ему параметром. Иными словами, при вызове result. fetchrows(2) возвращается список, состоящий из очередных двух строк. Метод возвращает список, состоящий из всех строк, если ему передан параметр, меньший 0 — как в данном примере. Сочетая этот метод с обращением к seek(), можно перемещаться по результирующему набору. Метод seek() принимает целочисленный параметр, указывающий на строку, с которой вы хотите работать, при этом 0 указывает на первую строку.

Метаданные базы данных

Хотя только MySQL API поддерживает динамическое управление результирующим набором (по крайней мере, на момент данной публикации), оба API поддерживают метаданные базы данных с помощью почти идентичных наборов методов. Метаданные базы данных представляют собой информацию о соединении с базой данных. В примере 11-3 приведена сессия Python, заставляющая соединения с MySQL и mSQL рассказать о себе.

Пример 11-3. Данные

[7:56pm] athens> python

Python 1.5.1 (#1, Jun 13 1998, 22:38:15) [GCC 2.7.2] on sunos5

Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam

>>> import mSQL, MySQL;

>>> msql = mSQL.connect();

>>> mysql = MySQL.connect();

>>> print msql.listdbs();

['db_test', 'db_web']

>>> print mysql.listdbs();

[['dbjest'], ['mysql'], ['test']]

>>> msql.selectdb('db_test');

>>> mysql.selectdb('db_test');

>>> print msql. listtables();

['test', 'hosts']

>>> print mysql.listtables();

[['test']]

>>> print msql.serverinfo;

2.0.1

>>> print mysql.serverinfo();

3.21.17a-beta-log

>>> print mysql.clientinfo();

MySQL-Python-1.1

>>> print msql.hostname;

None

>>> print mysql.hostinfo();

Localhost via UNIX socket

>>> print mysql.stat();

Uptime: 4868410 Running threads: 1 Questions: 174 Reloads: 4 Open tables: 4

>>> print mysql.listprocesses();

None

>>>

В этом примере долгая серия обращений к методам обеспечивает вывод расширенной информации о соединениях с базами данных. В ряде случаев mSQL предоставляет эту информацию через неизменяемые атрибуты, а не методы. MySQL API предоставляет значительно больше сведений, чем mSQL. Обратитесь к справочному разделу части III «Справочник» за полным описанием этих методов и атрибутов.


Содержание раздела