Cursor.rollback() всегда падает!
MySQLdb теперь поддерживает транзакции, если сервер поддерживает транзакционно-безопасные таблицы (TST), и Вы используете их. Если Ваш сервер не поддерживает их, rollback всегда будет терпеть неудачу потому, что система не в состоянии выполнить Ваши инструкции. Даже если Ваш сервер поддерживает транзакционно-безопасные таблицы, rollback будет терпеть неудачу, если Вы изменили любую не-TST таблицу.
cursor.commit(), который пытается завершить транзакцию всегда работает нормально потому, что MySQL по существу всегда в режиме auto-commit mode (если Вы не его не выключили).
ImportError: libmysqlclient.so.6: cannot open shared object file: No such file or directory
Вы имеете динамические библиотеки MySQL, и по умолчанию Ваш компилятор линкует _mysql.so с ними, но они не в пути загрузчика, когда Вы запускаете Python. Вы имеете два базисных параметра:
Модифицируйте setup.py так, чтобы это компоновалось со статической библиотекой: уж ее-то искать не понадобится. Если Ваш компоновщик поддерживает переключатель пути загрузчика во время выполнения, Вы можете также устанавливать это в setup.py. Измените Вашу среду системы так, чтобы MySQL библиотеки нашлись в Вашем пути загрузчика. В Linux Вы можете изменять /etc/ld.so.conf или Вы можете добавить каталог к системной переменной LD_LIBRARY_PATH перед запуском Python. LD_LIBRARY_PATH=/path/to/mysql/libs python ... # Bourne-ish shell
Я установил MySQLdb, но ZMySQLDA его не видит
Вероятно, Вы установили двоичную версию Zope, которая приходит со своим собственным интерпретатором Python. Вы должны компилировать MySQLdb с той специфической установкой Python. Выясните, где находятся двоичные модули python и используйте это, чтобы выполнить setup.py.
ImportError: ./_mysql.so: undefined symbol: PyLong_FromUnsignedLongLong
PyLong_FromUnsignedLongLong() сначала появляется в Python 1.5.2, так что Вы компонуете с более старой версией. Вы можете также иметь больше, чем одну установленную версию. Получите Python 1.5.2 (а лучше посвежее) с python.org.
Я получаю буквы L в столбцах INTEGER
Вообще-то они должны быть преобразованы в длинные целых числа, чтобы избежать переполнения на столбцах UNSIGNED INT. Решения: используйте атрибут fmt=%d на элементах dtml-var или поставьте Zope 2.4, который приходит с Python 2.1, который не добавляет L.
Как я могу использовать некоторые из специальных свойств СУБД MySQL?
С одной стороны, никак. Не делайте этого, если Вы можете избежать этого. Ваша программа не будет переносима к другим базам данных.
Но если Вас эта переносимость не интересует, то почти все специальные обращения API выполнены в объекте _mysql, и объект связи в MySQLdb может также вызывать их.
ImportError: ./_mysql.so: undefined symbol: uncompress
Библиотеки пользователей MySQL-3.23 требуют libz для сжатия gzip. Скрипт setup.py должен бы добавить это автоматически.
Я получаю синтаксическую ошибку SQL на предложениях LIMIT, но я не помещал в запрос слово LIMIT!
Z метода SQL имеют параметр max_rows. Если это установлено к значению, отличному от нуля, ZMySQLDA автоматически добавляет предложение LIMIT к инструкции SELECT. Это сильно повышает эффективность, особенно, если набор результатов мог бы быть большим. Если это сталкивается с чем-то, установите max_rows в ноль, и это не будет добавлять предложение LIMIT. В частности, Вы, вероятно, должны будете сделать это при вставке строк со столбцами AUTO_INCREMENT, поскольку обычно Вы используете SELECT, чтобы получить LAST_INSERT_ID(), а LIMIT может блокировать это.
Я все еще хочу использовать _mysql
Хорошо, это может быть необходимо в каком-то случае. ZMySQLDA делает это потому, что Zope-модуль ZRDB сам по себе API, а слишком много уровней API имеют тенденцию к разброду и шатанию. С этим поделать что-либо трудно. Кроме того, было фактически довольно просто сделать это именно таким способом, да и эффективность малость повысилась.
Читайте документацию на MySQL, особенно C API для краткого обзора. Читайте документацию на MySQLdb. Это показывает, как C API транслируется в Python. К тому же, это неплохой пример реализации. Читайте исходники для MySQLdb, особенно рекомендуется для изучения файл MySQLdb/cursors.py. Этот файл содержит большинство деталей, особенно в реализации методов _query.
Mysql.c:33: mysql.h: No such file or directory
Путь для include-файлов (-I) к Вашим MySQL include-файлам ошибочен. Поправьте скрипт setup.py. Другой вариант: Вы не имеете набора разработчика для MySQL. Если Вы используете Red Hat RPM, Вы нуждаетесь в RPM-пакете MySQL-devel, чтобы откомпилировать _mysql.so. Однако, если Вы компонуетесь со статическими библиотеками MySQL, Вы можете устанавливать _mysql.so на системе, которая не имеет библиотек пользователей MySQL (libmysqlclient).
MySQLmodule
MySQLmodule, старый интерфейс MySQL, разработанный Joe Skinner, является также интерфейсом C/Python. MySQL, C-часть, имеет интерфейс, подобный perl DBI. Кроме того, имеется часть Python, Mysqldb, которая обеспечивает интерфейс DB API v1.0, написанный James Henstridge. MySQLdb-0.2.2 и выше включает CompatMysqldb, который является адаптацией Mysqldb к _mysql. Это должно рассмотреться экспериментальным решением.
Напротив, C-часть MySQLdb, _mysql, разработана в соответствии с MySQL C API объектно-ориентированным способом. MySQLdb обеспечивает интерфейс DB API v2.0, который имеет некоторые отличия от v1.0, в частности такие изменения:
Действие | Mysqldb | MySQLdb |
Соединение | db=Mysqldb.Mysqldb("db@host user pass") | db=MySQLdb.connect(db='db', host='host', user='user', passwd='pass') |
Неявный курсор | db.execute(SQL) | Неявные курсоры удалены из DB API v2.0. Всегда используйте c=db.cursor() |
Строка выборок как словарь | c.fetchDict(), ключи: "table.column" | Не стандарт: альтернативный класс DictCursor предоставляет интерфейс словаря, ключи являются "column" или "table.column , если имеются два столбца с одним именем. Используйте SQL-оператор AS для переименования полей. |
Транзакции | db.commit() и db.rollback() мирно сосуществуют вместе и тихо не делают ничего (опасно!) | db.commit() и db.rollback() работают, если сервер MySQL может выполнять транзакции, иначе db.rollback() всегда терпит неудачу. |
Модуль _mysql
Если Вы хотите писать прикладные программы, которые переносимы между базами данных, избегайте использовать этот модуль непосредственно. Модуль _mysql обеспечивает интерфейс, который обычно осуществляет MySQL C API. Для получения большего количества информации обратитесь к документации на пакет MySQL. Документация для этого модуля преднамеренно слаба потому, что Вы, вероятно, должны использовать более высокий уровень (модуль MySQLdb).
MySQLdb: интерфейс DB API
MySQLdb представляет собой тонкую обертку на Python вокруг _mysql. MySQLdb делает его совместимым с интерфейсом Python DB API (version 2). В действительности код, который осуществляет API, находится в _mysql ради эффективности.
Использование и расширение
Базы данных, даже SQL-базы данных, изменяются по возможностям очень сильно и могут иметь ненормативные свойства. DB API делает хорошую работу по обеспечению приемлемо переносимого интерфейса, но некоторых методов там нет. Специфические параметры для connect()полностью зависимы от реализации.
Если Вы полагаете, что Ваша прикладная программа должна выполниться на нескольких различных базах данных, автор рекомендует следующий подход, основанный на персональном опыте: пишите упрощенный API для Вашей прикладной программы, который осуществляет специфические запросы и операции, которые Ваша прикладная программа должна выполнить. Выполните этот API как основной класс, который должен иметь немного зависимостей от базы данных, а затем получите подкласс, который осуществляет необходимые зависимости. Таким образом, перенос Вашей прикладной программы к новой базе данных должен быть относительно простым вопросом создания нового подкласса для базы данных.
В качестве примера рекомендую изучить модуль SQLDict (http://dustman.net/andy/python), который позволяет стандартным запросам работать, используя объект, который напоминает словарь, а также читать и писать определяемые пользователем дополнительные объекты.
Поскольку объекты MySQLdb Connection и Cursor написаны на Python, Вы можете легко получать Ваши собственные подклассы. Имеются несколько классов Cursor в MySQLdb.cursors:
BaseCursor Основной класс для объектов Cursor. Не вызывает Warning. CursorWarningMixIn Создает исключительную ситуацию Warning на запросах, которые производят предупреждения. CursorStoreResultMixIn Заставляет Cursor использовать функцию mysql_store_result(), чтобы получить результат запроса. Весь набор результатов сохранен на стороне пользователя. CursorUseResultMixIn Заставляет курсор использовать функцию mysql_use_result(), чтобы получить результат запроса. Набор результатов сохранен на стороне сервера и передается построчно. CursorTupleRowsMixIn Заставляет cursor возвращать строки как блоки значений столбца. CursorDictRowsMixIn Заставляет cursor возвращать строки как как словарь, где ключи имена столбца, а значения представляют значения столбца. Обратите внимание, что, если имена столбца не уникальны, то есть, Вы выбираете из двух таблиц, которые совместно используют имена столбца, некоторые из них будут переделаны в table.column. Этого можно избежать, используя ключевое слово SQL AS Cursor Заданный по умолчанию класс курсора. Этот класс составлен из CursorWarningMixIn, CursorStoreResultMixIn, CursorTupleRowsMixIn и BaseCursor, то есть он создает исключительную ситуацию Warning, использует mysql_store_result() и возвращает строки как блоки. DictCursor Аналогичен Cursor за исключением того, что возвращает строки как словари. SSCursor Серверный курсор. Похож на Cursor, но использует CursorUseResultMixIn. Используйте только, если Вы имеете дело с потенциально большими наборами результатов. SSDictCursor Аналогичен SSCursor за исключением того, что возвращает строки как словари. XXXCursorNW Курсоры с суффиксом NW не создают исключительную ситуацию Warning.
Я использую только Windows...
А я не использую Windows. Скрипт setup.py, как предполагается, работает. Может также быть связь с каким-либо сторонним пакетом.
DateTime
Если Вы имеете установленный пакет mx.DateTime , MySQLdb использует его для связанных с датой объектов. Иначе они будут возвращены как строки. Вы можете также изменять словарь преобразования типов, чтобы возвратить их как другие объектные классы.
FAQ
FAQ доступны на http://dustman.net/andy/python/MySQLdb/faq/MySQLdb-FAQ.html.
Функции и атрибуты
Только несколько высокопоставленных функций и атрибутов определены внутри MySQLdb.
connect(parameters...) Конструктор для создания подключения. Возвращает объект подключения (Connection Object). Параметры те же, как и для MySQL C API. Кроме того, имеются несколько дополнительных ключевых слов, которые соответствуют тому, что Вы передали бы как mysql_options() перед соединением. Обратите внимание, что некоторые параметры должны быть определены как параметры ключевого слова! Значение по умолчанию для каждого параметра: NULL или 0, зависит от типа. Важные параметры:
host Имя компьютера, с которым надлежит соединиться Значение по умолчанию: используйте локальный компьютер. user Пользователь, чтобы авторизоваться на сервере. Значение по умолчанию: текущий эффективный пользователь. passwd Пароль, чтобы авторизоваться на сервере. Значение по умолчанию: никакого пароля (пустой пароль). db База данных, которую надо использовать. Значение по умолчанию: никакой заданной по умолчанию базы данных. port TCP-порт сервера MySQL. Значение по умолчанию: стандартный порт (3306). unix_socket Расположение сокета UNIX. Значение по умолчанию: использование TCP. conv Словать преобразования типов. Значение по умолчанию: копия MySQLdb.converters.conversions. compress Включить сжатие протокола. Значение по умолчанию: никакого сжатия. connect_timeout Аварийное прекращение работы, если соединение не завершено в рамках данного числа секунд. Значение по умолчанию: нет тайм-аута. named_pipe Использовать именованный канал (только под Windows). Значение по умолчанию: не делать этого. init_command Начальная команда, которую надо выдать на сервер при подключении. Значение по умолчанию: нет. read_default_file Файл настроек MySQL. Отсюда берутся mysql_options(). read_default_group Заданная по умолчанию группа в файле настроек. Отсюда берутся mysql_options(). cursorclass Класс курсора, который использует cursor(), если не перекрыт. Значение по умолчанию: MySQLdb.cursors.Cursor. Это должно быть параметром ключевого слова.
apilevel Строковая константа, задающая поддерживаемый уровень DB API: '2.0'. threadsafety Константа типа Integer, устанавливающая уровень поточной безопасности, который поддерживает интерфейс. С MySQLdb version 0.9.0 это установлено в 1, что означает: потоки могут совместно использовать модуль.
Протокол MySQL не может обрабатывать много потоков, использующих то же самое подключение, сразу. Более ранние версии MySQLdb использовали блокировку, чтобы достигнуть threadsafety=2. Несмотря на то, что это не должно активно использовать стандартный класс Cursor (который используется в mysql_store_result()), это усложнено SSCursor (который используется в mysql_use_result(). Здесь Вы должны гарантировать, что все строки прочитались прежде, чем другой запрос сможет быть выполнен. Это далее усложнено добавлением транзакций, начинающихся когда курсор выполняет запрос, и завершающихся выполнением COMMIT или ROLLBACK объектом Connection. Два потока не могут совместно использовать подключение, в то время как транзакция происходит, в дополнение к неспособности совместно использовать его в течение выполнения запроса. К сожалению, это чрезмерно усложнило код.
Общий результат этого: совместно не используйте подключения разными потоками. Это не стоит прилагаемых усилий и в результате, вероятно, причинит вред эффективности, так как сервер MySQL выполняет отдельный поток для каждого подключения. Вы можете, конечно, делать кэширование подключений через специальный пул, и давать подключения с одним потоком одновременно. Если Вы позволяете двум потокам использовать подключение одновременно, библиотека пользователей MySQL, вероятно, будет сваливаться.
paramstyle Строковая константа, устанавливающая тип маркера параметра, форматирующего ожидаемое интерфейсом. Установите в 'format'=ANSI C printf-коды формата, например '...WHERE name=%s'. Если объект отображения используется для conn.execute(), то интерфейс фактически использует 'pyformat'= расширенные форматные коды Python, например, '...WHERE name=%(name)s'. Однако, API теперь не позволяет спецификацию больше, чем одного стиля в paramstyle.
Примечание о совместимости: старые версии MySQLmodule используют подобную схему задания параметра, но требуют, чтобы кавычки были помещены вокруг строк формата, которые будут содержать строки, даты и подобные символьные данные. Это не требуется для MySQLdb. Рекомендуется, чтобы %s (но не '%s') использовался для всех параметров, независимо от типа. Интерфейс выполняет все необходимое цитирование сам.
conv Словарь, отображающий типы MySQL (из FIELD_TYPE.*) к вызываемым объектам Python (обычно функциям), которые преобразовываются из строк в нужные типы. Это инициализировано с приемлемыми значениями по умолчанию для большинства типов. При создании объекта Connection Вы можете передать Ваш собственный словарь конвертера типа как параметр ключевого слова. Иначе это использует копию MySQLdb.converters.conversions. Словарь включает некоторые из функций модуля DateTime, если это доступно. Несколько ненормативных типов возвращены как строки,
Начиная с MySQL-3.23, MySQL поддерживает различные наборы символов на клиенте и сервере, а также новую функцию цитирования mysql_real_escape_string(). Это требует, чтобы функция цитирования строки была методом, связанным с объектом connection. MySQLdb обрабатывает это для Вас автоматически. Однако, если Вы чувствуете потребность сделать что-то особое со строками, Вы должны изменить словарь после открытия подключения.
Использование MySQLdb
MySQLdb представляет собой модуль, соответствующий спецификации Python Database API 2.0 (http://www.python.org/topics/database/DatabaseAPI-2.0.html), так что Вы должны быть знакомы с этой спецификацией. Здесь указаны отличия: http://dustman.net/andy/python/MySQLdb/doc/MySQLdb.html.
Компиляция _mysql.so
Имеются некоторые общие ошибки, которые случаются в ходе построения пакета. Этот раздел покрывает только проблемы UNIX/Linux, поскольку я не делаю пакетов под Windows. Файлы типа .so представляют собой динамические библиотеки в Linux и большинстве других вариантов UNIX. Windows использует расширение .dll.
Linux/UNIX
Этот модуль разработан на RedHat Linux (в настоящее время 7.1) для Intel. Это должно формироваться без больших трудностей на большинстве платформ, используя скрипт setup.py. Возможно этот модуль работает и под MacOS X. Вы нуждаетесь в пакете Distutils, который поставляется с Python 2.0. Если Вы не имеете его (то есть Вы имеете Python 1.5.2), Вы можете скачать пакет с сайта http://www.python.org/.
и выше. Некоторые старые версии
Гарантируется работа версии 3.22.32 и выше. Некоторые старые версии могут работать, если Вы имеете старшую версию, Вы должны серьезно подумать об апгрейде в целях исправления ошибок и дыр в защите.
MySQL-3.22 имеет проблему при попытке вставить значения TIME с дробными секундами. Значения, подобные 12:56:13.00, возвращены как 344:13:00, очевидно интерпретируя первоначальный ввод как 12 дней, 56 часов, 13 минут и 0 секунд (12 дней и 56 часов=344 часа). Чтобы избежать этой проблемы, используйте тип DateTimeDelta.
MySQLdb поддерживает транзакции, если их
MySQLdb поддерживает транзакции, если их поддерживает сервер. Но не гарантирует, что транзакции будут работать. Для этого Вы должны использовать транзакционно-безопасную таблицу (TST). Текущие TST: BDB и InnoDB. Таблицы GEMINI намечены для MySQL-4.0. Обратите внимание, что MySQL функционирует в режиме AUTOCOMMIT по умолчанию, и MySQLdb считает, что AUTOCOMMIT включен. Чтобы изменить это, используйте инструкции SQL SET AUTOCOMMIT=0.
MySQLdb: Python-интерфейс для MySQL
MySQLdb представляет собой поточно-совместимый интерфейс с популярной СУБД MySQL, который обеспечивает Python API для баз данных. Здесь рассматривается его версия 0.9.1 (автор Andy Dustman, andy@dustman.net). Пакет распространяется по лицензии GPL и доступен для закачки с http://sourceforge.net/projects/mysql-python. Цели проекта:
Совместимость с Python API для баз данных (версия 2.0). Поточно-безопасная работа. Потоки теперь не будет блокировать друг друга. Совместимость с MySQL-3.23 и выше.
Требования:
Python 1.5.2 или выше:
http://www.python.org Версии ниже, чем 1.5.2, НЕ РАБОТАЮТ. Все версии, начиная с 1.5.2, работать должны. 1.6.x не тестировались. 2.0.1, 2.1.1 и 2.2a3 были протестированы успешно. Если Вы имеете Red Hat Linux или подобную систему установки пакетов, надлежит установить бибилотеки и заголовки разработчика для Python (python-devel). Для версий Python-2.x это python2-devel.
Distutils 1.0.2 или выше:
Поставляется с Python 1.6 и выше. 1.0.2 включена в Python version 2.1 и выше. http://www.python.org/sigs/distutils-sig/download.html
MySQL 3.22.19 или выше.
http://www.mysql.com/downloads Версии ниже, чем 3.22 точно НЕ РАБОТАЮТ. Версии ниже, чем 3.22.19 могут не работать. MySQL-4.0 поддерживается. MySQL-3.23 поддерживается. Если Вы имеете Red Hat Linux или подобную систему установки пакетов, надлежит установить бибилотеки и заголовки разработчика для MySQL. Если Вы используете пакеты с mysql.com, Вам нужен пакет MySQL-devel. Если Вы используете пакеты Red Hat, Вам нужен mysql-devel. Я предпочитаю пакеты с сайта www.mysql.com.
Некоторые примеры использования
Метод connect() работает почти также, как и с _mysql: import MySQLdb db=MySQLdb.connect(passwd="moonpie",db="thangs") Чтобы выполнить запрос, Вы сначала нуждаетесь в курсоре, а затем Вы можете выполнять запросы на нем. c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (max_price,))
В этом примере max_price=5. Почему затем в строке использована опция %s? Потому, что MySQLdb преобразует это в литеральное значение SQL, которое является строкой '5'. Когда это закончено, запрос будет фактически таким: "...WHERE price < 5".
Так, а теперь результаты: >>> c.fetchone() (3L, 2L, 0L) В отличие от примера с _mysql, это возвращает одиночный блок результатов, который является строкой, и значения правильно преобразованы.
Как упомянуто ранее, в то время как столбец MySQL INTEGER транслируется в Python integer, UNSIGNED INTEGER может вызвать переполнение, так что эти значения преобразованы в Python long integer. До Python 1.6 long integer сохраняли L, когда были преобразованы в строки с помощью str(). В 1.6 и позже str() не включает L. Конечно, L всегда выводится при использовании repr().
Когда Вы закончили работу с транзакцией, Вы должны выполнить db.commit() или db.rollback(). Если сервер и таблицы не поддерживает транзакции, commit() будет работать, но rollback() вызовет исключительную ситуацию. Обратите внимание, что это методы connection, а не cursor, даже при том, что транзакция запускается через c.execute(...).
Если Вы хотели получить большее количество строк, Вы могли бы использовать c.fetchmany(n) или c.fetchall(). На c.fetchmany(n) параметр n факультативный и имеет значение по умолчанию c.arraysize (обычно 100). Оба этих метода возвращают последовательность строк, или пустую последовательность, если строки уже кончились.
Обратите внимание, что в отличие от вышеупомянутого, c.fetchone() вернет None, когда не имеется больше строк для выборки.
Единственный другой метод, который Вы, очень вероятно, используете, это многострочная вставка: c.execute("""INSERT INTO breakfast (name, spam, eggs, sausage, price) VALUES (%s, %s, %s, %s, %s)""", [ ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ), ("Not So Much Spam Plate", 3, 2, 0, 3.95 ), ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )])
Здесь мы вставляем три строки по пять значений в каждой. Обратите внимание, что имеется смесь типов (строки, int, float), хотя все еще используется только %s. А также обратите внимание, что включили только строки формата для одной строки. MySQLdb выбирает и дублирует их для каждой строки.
Объекты Connection
Объекты Connection возвращены функцией connect().
commit() Если база данных и таблица поддерживают транзакции, это передает текущую транзакцию, Иначе этот метод успешно не делает ничего. rollback() Если база данных и таблица поддерживают транзакции, это отменяет текущую транзакцию, Иначе этот метод вызывает исключение NotSupportedError.
Примечание совместимости: старые версии MySQLmodule определяют этот метод, так что он не далет ничего. Это опасное поведение, поскольку успешная обратная перемотка указывает, что текущая транзакция отменена.
cursor([cursorclass]) MySQL не поддерживает курсоры, однако, курсоры легко эмулируются. Вы можете обеспечивать альтернативный класс курсора как факультативный параметр. Если это не представлено, берется значение по умолчанию данное при создании объекта подключения или стандартного класса Cursor. begin() Явно запускает транзакции. Обычно Вы не должны использовать это: выполнение запроса начинает новую транзакцию, если ни одной работающей нет. Если включен AUTOCOMMIT, Вы можете использовать begin() для его временного отключения. AUTOCOMMIT продолжит работу после следующего вызова commit() или rollback.
Объекты Cursor
callproc() Не реализован. close() Закрывает курсор. Будущие операции вызывают исключение ProgrammingError. Если Вы используете курсоры стороны сервера, очень важно закрыть курсор, когда Вы с ним закончили, но перед созданием нового курсора. insert_id() Возвращает последнее значение поля AUTO_INCREMENT, вставленное в базу данных. info() Возвращает некоторую информацию относительно последнего запроса. Обычно Вы не должны проверять это. С заданным по умолчанию курсором любое предупреждение MySQL вызовет исключение Warning. Если Вы используете класс курсора без предупреждений, рекомендую проверять info(). Подробности в документации MySQL на mysql_info(). setinputsizes() Не делает ничего. setoutputsizes() Не делает ничего.
ы использования _mysql
Допустим, что Вы хотите использовать _mysql. Имеются некоторые примеры.
Самое простое подключение к базе данных: import _mysql db=_mysql.connect()
Это создает подключение к серверу MySQL на локальной машине, используя стандартый сокет UNIX, Ваше имя входа в систему (из системной переменной USER), пустой пароль и не применяет команду USE. Возможно, это будет работать у Вас, если Вы установили файл конфигурации (~/.my.cnf ). Но скорее всего Вы должны обеспечить большее количество информации: db=_mysql.connect("localhost","joebob","moonpie","thangs")
Это создает подключение к серверу MySQL на локальной машине, используя TCP на стандартном порте (3306), имя пользовател joebob, пароль moonpie и выбирает начальную базу данных thangs.
Конечно, Вы должны использовать TCP, если работаете с удаленной системой. Здесь я не рассмотрел часть параметров connect(), и Вы обратите внимание, что, если Вы используете позиционные параметры, настроить связь по TCP не так-то просто. Кроме того, сокеты UNIX быстрее. Я предпочитаю использовать параметры ключевого слова: db=_mysql.connect(host="localhost",user="joebob", passwd="moonpie",db="thangs") Это делает точно то же, что делал последний пример, но проще для чтения. Теперь, если Вы действительно хотели использовать сокет UNIX, и Ваше имя входа в систему joebob, Вы могли бы сократить этот пример до: db=_mysql.connect(passwd="moonpie",db="thangs") Имеются некоторые другие параметры, которые Вы можете использовать, и большинство их не так уж и необходимо, кроме одного, о котором чуть ниже. Во всем остальном обратитесь к встроенной документации. Модуль Python 2.1 pydoc представляет собой хороший справочник.
Теперь Вы имеете открытое подключение db и хотите сделать запрос. Не имеется никаких курсоров в MySQL и никакой подстановки параметров, так что Вы должны передать полную строку запроса db.query(): db.query("""SELECT spam, eggs, sausage FROM breakfast WHERE price < 5""") Не имеется никакого значения возврата, но исключительные ситуации могут быть вызваны. Исключительные ситуации определены в отдельном модуле, _mysql_exceptions, но _mysql экспортирует их. Читайте спецификацию DB API (http://www.python.org/topics/database/DatabaseAPI-2.0.html), чтобы выяснить то, чем они являются, или Вы можете использовать MySQLError.
В этой точке Ваш запрос был выполнен, и Вы должны получить результаты. Вы имеете два параметра: r=db.store_result() # ...или... r=db.use_result() Оба метода возвращают объект результата. В чем же разница? А в том, что store_result() возвращает весь набор результатов пользователю немедленно. Если Ваш набор результатов действительно большой, это станет проблемой. Один путь обхода этого состоит в том, чтобы добавить предложение LIMIT к Вашему запросу, чтобы ограничить число возвращенных строк. Но можно использовать use_result(), который хранит набор результатов на сервере и посылает его построчно, когда Вы выбираете. Это связывает ресурсы сервера и подключение: Вы не можете делать больше запросов, пока Вы не выбрали все строки. Вообще я рекомендую использовать store_result(), если Ваш набор результатов не огромен, и Вы не можете использовать LIMIT.
Теперь для фактического получения реальных результатов надо: >>> r.fetch_row() (('3','2','0'),) Первая вещь, которую Вы должны знать: fetch_row() берет некоторые дополнительные параметры. Первый задает, сколько строк (maxrows) должны быть возвращены. По умолчанию, это возвращает одну строку. Это может возвращать меньшее количество строк, чем Вы просите, но никогда не больше. Если Вы устанавливаете maxrows=0, это возвращает все строки набора результатов. Если Вы когда-либо получаете пустой набор, значит Вы исчерпали строки.
Второй параметр (how) сообщает как строка должна представиться. По умолчанию, это ноль, что означает вернуть как набор. how=1 значит вернуть данные как словарь, где ключи представляют собой имена столбца или table.column, если имеются два столбца с тем же самым именем. how=2 аналогично how=1, кроме того, что ключи всегда table.column, это для совместимости со старым модулем Mysqldb.
Другая причуда: известно, что обрабатываются числовые столбцы, почему они возвращены как строки? Потому, что MySQL возвращает все данные как строки просто по определению и ожидает, что Вы преобразуете их непосредственно. Как я понимаю, все данные в базе хранятся именно как строки, как бы они не выглядели снаружи. Это было бы реальной проблемой, но фактически _mysql может делать это для Вас. MySQLdb делает это для Вас сам. Чтобы иметь автоматическое выполненное преобразование типов, Вы должны создать словарь конвертера типов и передать его в connect() как параметр ключевого слова conv.
Ключи в conv должны быть типами столбцов MySQL, которые в C API являются FIELD_TYPE_*. Вы можете получать эти значения так: from MySQLdb.constants import FIELD_TYPE
По умолчанию любой тип столбца, который не может быть найден в conv, возвращен как строка, которая пригодна для самых разных применений. Для наших целей нужно: my_conv = {FIELD_TYPE.LONG: int} Это означает, если это FIELD_TYPE_LONG, обработать это встроенной int(). Обратите внимание, что FIELD_TYPE_LONG представляет собой столбец INTEGER, который соответствует C long, который является также типом, используемым для нормального целого числа в Python. Но остерегайтесь: если это столбец UNSIGNED INTEGER, это может вызвать переполнение. По этой причине MySQLdb фактически использует long(), чтобы сделать преобразование.
Затем, если Вы используете db=_mysql.connect(conv=my_conv...), результаты возвратятся в виде ((3, 2, 0),), который является тем, что и ожидается.
Python
MySQLdb требует Python 1.5.2 или новее. Более ранние версии не будут работать потому, что MySQL нужна поддержка для C long long. Если Вы имеете более раннюю версию Python, обновитесь хотя бы до 1.5.2. Текущая разработка выполнена в Python 2.1, но старый Python 1.5.2 все еще будет поддержан в обозримом будущем.
Трансляция MySQL C API
MySQL C API был обернут объектно-ориентированным способом. Единственные MySQL структуры данных, которые выполнены в данном интерфейсе, это MYSQL (дескриптор подключения базы данных) и MYSQL_RES (дескриптор результата). Вообще, любая функция, которая берет как параметр MYSQL *mysql, теперь представляет собой метод объекта подключения, и любая функция, которая берет MYSQL_RES *result, теперь метод объекта результата. Функции, не требующие ни одной структуры MySQL, выполнены как функции в модуле. Функции, требующие какую-то из других структур данных MySQL, вообще не выполнены. Во всех случаях префикс mysql_ удален из имени. Большинство перечисленных методов conn также доступно как методы объекта MySQLdb Connection. Их использование не переносимо между базами данных.
C API | _mysql |
mysql_affected_rows() | conn.affected_rows() |
mysql_close() | conn.close() |
mysql_connect() | _mysql.connect() |
mysql_data_seek() | result.data_seek() |
mysql_debug() | _mysql.debug() |
mysql_dump_debug_info | conn.dump_debug_info() |
mysql_escape_string() | _mysql.escape_string() |
mysql_fetch_row() | result.fetch_row() |
mysql_get_client_info() | _mysql.get_client_info() |
mysql_get_host_info() | conn.get_host_info() |
mysql_get_proto_info() | conn.get_proto_info() |
mysql_get_server_info() | conn.get_server_info() |
mysql_info() | conn.info() |
mysql_insert_id() | conn.insert_id() |
mysql_list_dbs() | conn.list_dbs() |
mysql_list_fields() | conn.list_fields() |
mysql_list_processes() | conn.list_processes() |
mysql_list_tables() | conn.list_tables() |
mysql_num_fields() | result.num_fields() |
mysql_num_rows() | result.num_rows() |
mysql_options() | _mysql.connect() |
mysql_ping() | conn.ping() |
mysql_query() | conn.query() |
mysql_real_connect() | _mysql.connect() |
mysql_real_query() | conn.query() |
mysql_real_escape_string() | conn.escape_string() |
mysql_row_seek() | result.row_seek() |
mysql_row_tell() | result.row_tell() |
mysql_select_db() | conn.select_db() |
mysql_stat() | conn.stat() |
mysql_store_result() | conn.store_result() |
mysql_thread_id() | conn.thread_id() |
mysql_use_result() | conn.use_result() |
CLIENT_* | MySQLdb.constants.CLIENT.* |
CR_* | MySQLdb.constants.CR.* |
ER_* | MySQLdb.constants.ER.* |
FIELD_TYPE_* | MySQLdb.constants.FIELD_TYPE.* |
FLAG_* | MySQLdb.constants.FLAG.* |
что Вы будете делать, редактирование
Первое, что Вы будете делать, редактирование скрипта setup.py. Имеются некоторые переменные, которые сообщают где искать MySQL include-файлы и библиотеки. Значения корректны для стандартной установки MySQL в Red Hat Linux (6.2) RPM. Если Вы имеете другую платформу, Вы должны будете вычислить нужные значения самостоятельно. Вам почти никогда не придется изменять это. Если Вы имеете старую версию distutils (до 1.0.2), обновитесь или удалите параметры, относительно которых система возражает.
Обратите внимание, что недавние двоичные дистрибутивы с www.mysql.com включают два набора библиотек пользователей: mysqlclient и mysqlclient_r. Последний хранит поточно-безопасные библиотеки, так что используйте именно его, если потоки Вам нужны.
Если Вы имеете динамические библиотеки пользователей (в Linux .so-файлы), они будут использоваться по умолчанию. Если они не в Вашем стандартном пути загрузчика, Вы должны будете установить или откорректировать системную переменную LD_LIBRARY_PATH (в Linux) или ту, которую Ваша платформа требует. Иначе Вы можете скорректировать setup.py, чтобы компоновать со статической библиотекой. Если Вы используете стандартный пакет RPM, с этим не должно быть особых проблем.
ПРЕДУПРЕЖДЕНИЕ: Если Вы используете двоичный пакет Zope, Вы нуждаетесь в выполнении скрипта setup.py программой python из Zope. Иначе Zope (ZMySQLDA) не может найти _mysql.
Если Вы предпочитаете RPM, Вы можете использовать команду bdist_rpm с setup.py. Это только формирует RPM, но не устанавливает его.
Этот модуль должен быть совместим с более старым интерфейсом, написанным Joe Skinner. Однако, старая версия:
Не поточно-совместимая (операции базы данных могли бы блокировать все другие потоки) Написан для MySQL 3.21 (не компилируется для более новых версий без заплаток) Не очень активно поддерживается
MySQLdb полностью новый модуль, распространяемый бесплатно согласно GNU Public License. Никакой код из той версии не используется в MySQLdb.
Zope и ZMySQLDA
Был написан пакет ZMySQLDA для использования с MySQLdb. Это адаптируется из ZOracleDA Digital Creations разработчиков системы Zope.
Как я могу получить уникальный ID для последней вставленной строки?
Если Вы вставляете запись в таблицу, содержащую столбец, который имеет атрибут AUTO_INCREMENT, Вы можете получать последнее значение ID вызовом mysql_insert_id().
Вы можете также получать ID, используя функцию LAST_INSERT_ID() в строке запроса, которую Вы передаете mysql_query().
Вы можете проверять, используется ли индекс AUTO_INCREMENT, выполняя следующий код. Это также проверит, был ли запрос INSERT с индексом AUTO_INCREMENT:
if (mysql_error(pmysql)[0]=0) && (mysql_num_fields(result)=0) && (mysql_insert_id(pmysql) != 0) then begin used_id := mysql_insert_id(pmysql); end;
Недавно сгенерированный ID хранится на сервере с привязкой к подключению. Это не будет изменено другим пользователем. Это не будет даже изменено, если Вы модифицируете другой столбец AUTO_INCREMENT не со специальным значением (то есть значением, которое не NULL и не 0).
Если Вы хотите использовать ID, который был сгенерирован для одной таблицы и вставлять его во вторую таблицу, Вы можете использовать инструкции SQL подобно этому: INSERT INTO foo (auto,text) VALUES(NULL,'text'); # generate ID by inserting NULL INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text'); # use ID in second table
Какой результаты я могу получить из запроса?
В дополнение к набору результатов, возвращенному запросом, Вы можете также получать следующую информацию:
mysql_affected_rows() возвращает число строк, на которые воздействует последний запрос при выполнении INSERT, UPDATE или DELETE. Исключительная ситуация: DELETE используется без предложения WHERE, таблица будет пересоздана пустой, что намного быстрее! В этом случае mysql_affected_rows() возвращает ноль для числа записей. mysql_num_rows() возвращает число строк в наборе результатов. При использовании mysql_store_result() mysql_num_rows() может быть вызван, как только отработает mysql_store_result(). При использовании mysql_use_result() mysql_num_rows() может быть вызван только после того, как Вы выбрали все строки с помощью mysql_fetch_row(). mysql_insert_id() возвращает ID, сгенерированный последним запросом, который вставил строку в таблицу с индексом AUTO_INCREMENT. Подробности в разделе "6.3.126 mysql_insert_id()". Некоторые запросы (LOAD DATA INFILE ..., INSERT INTO ... SELECT ..., UPDATE) возвращают дополнительную информацию. Результат возвращен через mysql_info(). mysql_info() вернет NULL если не имеется никакой дополнительной информации.
Mysql_affected_rows()
tmy_ulonglong mysql_affected_rows(mysql:PMYSQL):TMY_ULONGLONG; stdcall;
Mysql_change_user()
mysql_change_user(mysql: PMYSQL; const user,passwd, db:pchar):TMY_BOOL;stdcall;
Mysql_connect()
mysql_connect(mysql: PMYSQL; const host,user,passwd:pchar):PMYSQL; stdcall;
Mysql_create_db()
mysql_create_db(mysql:PMYSQL; const db:pchar):integer;stdcall;
Mysql_data_seek()
mysql_data_seek(res:PMYSQL_RES;offset:TMY_ULONGLONG); stdcall;
MySQL DELPHI API
Пользователь имеет максимальный размер буфера связи. Размер буфера, который распределен первоначально (16 килобайт), автоматически увеличивается до максимального размера (максимум 16 мегабайт). Поскольку размеры буфера растут только по запросу, просто увеличивая заданное по умолчанию максимальное ограничение, Вы не заставите большее количество ресурсов использоваться. Эта проверка размера обычно применяется в сложных ситуациях.
Буфер связи должен быть достаточно большим, чтобы хранить одиночную инструкцию SQL (для трафика "клиент-на сервер") и одну строку возвращенных данных (для трафика "сервер-на-клиент"). Буфер связи каждого потока будет динамически расширен до максимального ограничения, чтобы обработать любой запрос или строку. Например, если Вы имеете значения BLOB, которые содержат до 16M данных, Вы должны иметь ограничение буфера связи по крайней мере в 16M (на клиенте и на сервере сразу). Заданный по умолчанию максимум пользователя равен 16M, но заданный по умолчанию максимум сервера равен всего 1M. Вы можете увеличивать это, меняя значение параметра max_allowed_packet при запуске сервера.
Сервер MySQL сокращает каждый буфер связи до net_buffer_length байт после каждого запроса. Для клиентуры размер буфера, связанного с подключением, не будет уменьшен, пока подключение не будет закрыто.
Mysql_drop_db()
mysql_drop_db(mysql:PMYSQL; const db:pchar):integer;stdcall;
Mysql_dump_debug_info()
mysql_dump_debug_info(mysql:PMYSQL):integer;stdcall;
Mysql_escape_string()
Это идентично mysql_real_escape_string() за исключением того, что требуется подключение как первый параметр. mysql_real_escape_string() обработает строку согласно текущему (актуальному) набору символов, в то время как mysql_escape_string() игнорирует установку charset.
Mysql_fetch_field()
mysql_fetch_field(res:PMYSQL_RES):PMYSQL_FIELD;stdcall;
Mysql_fetch_field_direct()
mysql_fetch_field_direct(res:PMYSQL_RES; fieldnr:integer):PMYSQL_FIELD;stdcall;
Mysql_fetch_fields()
mysql_fetch_fields(res:PMYSQL_RES):PMYSQL_FIELDS;stdcall;
Mysql_fetch_lengths()
mysql_fetch_lengths(res:PMYSQL_RES):longword;stdcall;
Mysql_fetch_row()
mysql_fetch_row(res:PMYSQL_RES):PMYSQL_ROW;stdcall;
Mysql_field_count()
mysql_field_count(mysql:PMYSQL):longword;stdcall;
Если Вы используете версию MySQL ранее, чем Version 3.22.24, Вы должны вместо этого использовать mysql_num_fields(res:PMYSQL_RES):longword; stdcall;.
Mysql_field_seek()
mysql_field_seek(res:PMYSQL_RES; offset:TMYSQL_FIELD_OFFSET): TMYSQL_FIELD_OFFSET; stdcall;
Mysql_field_tell()
mysql_field_tell(res:PMYSQL_RES):longword;stdcall;
Mysql_get_proto_info()
mysql_get_proto_info(mysql:PMYSQL):longword;stdcall;
Mysql_get_server_info()
mysql_get_server_info(mysql:PMYSQL):pchar;stdcall;
Mysql_insert_id()
mysql_insert_id(mysql:PMYSQL):TMY_ULONGLONG;stdcall;
Mysql_kill()
mysql_kill(mysql:PMYSQL;pid:longword):integer;stdcall;
Mysql_list_dbs()
mysql_list_dbs(mysql:PMYSQL;const wild:pchar):PMYSQL_RES;stdcall;
Mysql_list_fields()
mysql_list_fields(mysql:PMYSQL;const table,wild:pchar):PMYSQL_RES; stdcall;
Mysql_list_processes()
mysql_list_processes(mysql:PMYSQL):PMYSQL_RES;stdcall;
Mysql_list_tables()
mysql_list_tables(mysql:PMYSQL;const wild:pchar):PMYSQL_RES;stdcall;
Mysql_num_fields()
mysql_num_fields(res:PMYSQL_RES):longword;stdcall;
Mysql_num_rows()
mysql_num_rows(res:PMYSQL_RES):TMY_ULONGLONG;stdcall;
Mysql_options()
mysql_options(mysql: PMYSQL; option: TMYSQL_OPTION; const arg: pchar): integer ;stdcall;
Mysql_query()
mysql_query(mysql:PMYSQL; const q:pchar):integer;stdcall;
Mysql_real_connect()
mysql_real_connect(mysql: PMYSQL; const host,user,passwd,db:pchar; port:longword; const unix_socket:pchar; clientflag:longword):PMYSQL;stdcall;
Mysql_real_escape_string()
mysql_real_escape_string(mysql:PMYSQL; wto:pchar; const wfrom:pchar; wfromlength:longword):longword;stdcall;
Mysql_real_query()
mysql_real_query(mysql:PMYSQL; const q:pchar; length:longword):integer;stdcall;
Mysql_row_seek()
mysql_row_seek(res:PMYSQL_RES; offset:PMYSQL_ROW_OFFSET):PMYSQL_ROW_OFFSET;stdcall;
Mysql_row_tell()
mysql_row_tell(res:PMYSQL_RES):PMYSQL_ROWS;stdcall;
Mysql_select_db()
mysql_select_db(mysql:PMYSQL; const db:pchar):integer;stdcall;
Mysql_store_result()
mysql_store_result(mysql:PMYSQL):PMYSQL_RES;stdcall;
Mysql_use_result()
mysql_use_result(mysql:PMYSQL):PMYSQL_RES;stdcall;
Обзор функций Delphi API
Функции, доступные в Delphi API, перечислены ниже и описаны более подробно в следующем разделе. Подробности в разделе "Описание функций Delphi API".
mysql_affected_rows() | Возвращает число строк измененных последним запросом UPDATE, DELETE или INSERT. |
mysql_close() | Закрывает подключение к серверу. |
mysql_connect() | Соединяется с сервером. |
mysql_change_user() | Меняет пользователя и базу данных на открытом подключении. |
mysql_create_db() | Создает базу данных. Аналог команды SQL CREATE DATABASE. |
mysql_data_seek() | Ищет произвольную строку в наборе результатов запросов. |
mysql_debug() | Делает DBUG_PUSH для заданной строки. |
mysql_drop_db() | Удаляет базу данных. Эта функция аналогична команде SQL DROP DATABASE. |
mysql_dump_debug_info() | Заставляет сервер писать информацию отладки в файл регистрации. |
mysql_eof() | Определяет, читалась или нет последняя строка набора результатов. |
mysql_errno() | Возвращает код ошибки для вызванной недавно функции MySQL. |
mysql_error() | Возвращает текстовое сообщение об ошибке для вызванной недавно функции MySQL. |
mysql_real_escape_string() | Выходит из специальных символов в строке для использования в инструкции SQL, принимающей во внимание текущий набор символов данного подключения. |
mysql_escape_string() | Выходит из специальных символов в строке для использования в обычной инструкции SQL. |
mysql_fetch_field() | Возвращает тип следующего поля таблицы. |
mysql_fetch_field_direct() | Возвращает тип поля таблицы, по номеру поля. |
mysql_fetch_fields() | Возвращает массив всех структур поля. |
mysql_fetch_lengths() | Возвращает длины всех столбцов в текущей (актуальной) строке. |
mysql_fetch_row() | Выбирает следующую строку из набора результатов. |
mysql_field_seek() | Помещает курсор столбца в определенный параметром столбец. |
mysql_field_count() | Возвращает число столбцов результата для последнего запроса. |
mysql_field_tell() | Возвращает позицию курсора поля, используемого для последнего вызова mysql_fetch_field(). |
mysql_free_result() | Освобождает память, используемую набором результатов. |
mysql_get_client_info() | Возвращает информацию о версии программы-клиента. |
mysql_get_host_info() | Возвращает строку, описывающую подключение. |
mysql_get_proto_info() | Возвращает версию протокола, используемую подключением. |
mysql_get_server_info() | Возвращает номер версии сервера. |
mysql_info() | Возвращает информацию относительно недавно выполненного запроса. |
mysql_init() | Получает или инициализирует структуру MYSQL. |
mysql_insert_id() | Возвращает ID, сгенерированный для столбца с поддержкой AUTO_INCREMENT предыдущим запросом. |
mysql_kill() | Уничтожает заданный поток. |
mysql_list_dbs() | Возвращает имена баз данных, соответствующие простому регулярному выражению. |
mysql_list_fields() | Возвращает имена полей, соответствующие простому регулярному выражению. |
mysql_list_processes() | Возвращает список текущих потоков сервера. |
mysql_list_tables() | Возвращает имена таблиц, соответствующие простому регулярному выражению. |
mysql_num_fields() | Возвращает число столбцов в наборе результатов. |
mysql_num_rows() | Возвращает число строк в наборе результатов. |
mysql_options() | Устанавливает опции связи для вызова mysql_connect(). |
mysql_ping() | Проверяет работает или нет подключение с сервером, повторно соединяется по мере необходимости. |
mysql_query() | Выполняет запрос SQL, определенный как строка с нулевым символом в конце. |
mysql_real_connect() | Соединяется с сервером. |
mysql_real_query() | Выполняет запрос SQL, определенный как рассчитанная строка. |
mysql_reload() | Сообщает, чтобы сервер перезагрузил таблицы предоставления привилегий. |
mysql_row_seek() | Переходит к строке в наборе результатов, используя значение, возвращенное из mysql_row_tell(). |
mysql_row_tell() | Возвращает позицию курсора строки. |
mysql_select_db() | Выбирает базу данных. |
mysql_shutdown() | Закрывает сервер. |
mysql_stat() | Возвращает состояние сервера. |
mysql_store_result() | Возвращает полный набор результатов пользователю. |
mysql_thread_id() | Возвращает ID потока. |
mysql_thread_safe() | Возвращает 1, если клиент компилируется как поточно-безопасный. |
mysql_use_result() | Инициализирует копию результата строка в строку. |
Чтобы соединиться с сервером, вызовите mysql_init(), чтобы инициализировать драйвер подключения, затем вызовите mysql_real_connect() с этим драйвером (наряду с другой информацией типа hostname, имени пользователя и пароля). При подключении mysql_real_connect() устанавливает флажок reconnect (часть структуры MYSQL) в значение 1. Этот флажок указывает, что когда запрос не может выполняться из-за потерянного подключения, надо попробовать повторно соединиться с сервером перед отказом. Когда Вы закончите работу с подключением, вызовите mysql_close() для его закрытия.
В то время как подключение активно, пользователь может посылать запросы SQL серверу, применяя функции mysql_query() или mysql_real_query(). Различие между ними в том, что mysql_query() ожидает, что запрос будет определен как строка с нулевым символом в конце, в то время как mysql_real_query() ожидает рассчитанную строку. Если несет в себе двоичные данные (которые сами по себе могут включать нулевые байты), Вы должны использовать только mysql_real_query().
Для каждого запроса не-SELECT (например, INSERT, UPDATE, DELETE), Вы можете выяснить, сколько строк были изменены, вызывая mysql_affected_rows().
Для запросов SELECT Вы получаете выбранные строки в наборе результатов. Обратите внимание, что некоторые инструкции подобны SELECT в том плане, что они возвращают строки. Сюда входят SHOW, DESCRIBE и EXPLAIN. Они должны обработаться тем же самым методом, что и обычный SELECT.
Имеются два пути для пользователя, чтобы обработать наборы результатов. Один путь состоит в том, чтобы получить весь набор результатов, вызывая mysql_store_result(). Эта функция получает с сервера все строки, возвращенные запросом и сохраняет их на клиенте. Второй путь инициализировать построчный набор результатов, вызывая mysql_use_result(). Эта функция инициализирует поиск, но фактически не получает никаких строк.
В обоих случаях Вы обращаетесь к строкам, вызывая mysql_fetch_row(). В случае mysql_store_result() mysql_fetch_row() обращается к строкам, которые уже были выбраны из сервера. В случае же mysql_use_result() mysql_fetch_row() фактически получает строку с сервера самостоятельно. Информация относительно размера данных в каждой строке доступна через вызов mysql_fetch_lengths().
После того, как Вы закончите работу с набором результатов, вызовите mysql_free_result(), чтобы освободить используемую память.
Два механизма поиска дополняют друг друга. Программы пользователя должны выбрать подход, который является наиболее подходящим для их требований. Практически же, клиентура имеет тенденцию обычно использовать mysql_store_result().
Преимущество mysql_store_result() в том, что, поскольку все строки были переданы пользователю, Вы не только можете обращаться к строкам последовательно, Вы можете также двигаться обратно в наборе результатов, используя mysql_data_seek() или mysql_row_seek(), чтобы изменить текущую (актуальную) позицию строки внутри набора результатов. Вы можете также выяснять, сколько там строк, вызывая mysql_num_rows(). С другой стороны, требования к памяти для mysql_store_result() могут быть очень высоки для больших наборов результатов, и Вы, вероятно, столкнетесь с проблемами нехватки памяти.
Преимущество mysql_use_result() в том, что пользователь требует меньшего количества памяти для набора результатов потому, что это поддерживает только одну строку одновременно (и потому, что имеется меньшее количество дополнительных распределений для заголовков, так что mysql_use_result() может быть быстрее). Недостаток: Вы должны обработать каждую строку быстро, чтобы не держать занятым сервер. Вы не имеете произвольного доступа к строкам внутри набора результатов (Вы можете только обращаться к строкам последовательно), и Вы не знаете, сколько строк находится в наборе результатов, пока Вы не получите их все. Кроме того, Вы должны принять все строки, даже если Вы определяете в середине поиска, что уже нашли ту информацию, которую Вы искали.
API позволяет клиентам ответить соответственно на запросы (получая строки только по мере необходимости) без того, чтобы знать, является или нет запрос SELECT. Вы можете делать это, вызывая mysql_store_result() после каждого mysql_query() (или mysql_real_query()). Если обращение к набору результатов прошло успешно, запросом был SELECT, и Вы можете читать строки. Если произошел сбой, вызовите mysql_field_count(), чтобы определить, должен или нет фактически ожидаться результат. Если mysql_field_count() возвращает ноль, запрос не возвратил никаких данных (это показывает, что это был INSERT, UPDATE, DELETE или что-то в этом роде) и не возвратит строки. Если mysql_field_count() отличен от нуля, запрос должен был возвратить строки, но не сделал этого. Это указывает, что запросом был SELECT, который потерпел неудачу.
Вызовы mysql_store_result() и mysql_use_result() позволяют Вам получать информацию относительно полей, которые составляют набор результатов (число полей, их имена, типы и т.п.). Вы можете обращаться к информации поля последовательно внутри строки, вызывая mysql_fetch_field() неоднократно, или по номеру поля внутри строки, вызывая mysql_fetch_field_direct() напрямую. Текущая (актуальная) позиция курсора поля может быть изменена вызовом mysql_field_seek(). Установка курсора поля воздействует на последующие обращения к mysql_fetch_field(). Вы можете также получать информацию для полей в любой момент, вызывая mysql_fetch_fields().
Для обнаружения и сообщения об ошибках MySQL обеспечивает доступ к информации ошибки посредством функций mysql_errno() и mysql_error(). Они возвращают код ошибки или сообщение об ошибке для последней вызванной функции, позволяя Вам определить, когда ошибка произошла, и что это было.
Возвращает число строк, измененных последним
Возвращает число строк, измененных последним UPDATE, удаленных последним DELETE или вставленных последней инструкцией INSERT. Может быть вызвана немедленно после mysql_query() для UPDATE, DELETE или INSERT. Для инструкции SELECT mysql_affected_rows() работает подобно mysql_num_rows().
Пытается устанавливать подключение с сервером MySQL на компьютере host. mysql_connect() должна завершиться успешно прежде, чем Вы сможете выполнить любую из функций API, за исключением mysql_get_client_info().
Значения параметров такие же, как для соответствующих параметров mysql_real_connect() с тем различием, что параметр подключения может быть NULL. В этом случае API распределяет память для структуры подключения автоматически и освобождает ее, когда Вы вызываете mysql_close(). Недостаток этого подхода в том, что Вы не можете получить сообщение об ошибке, если подключение терпит неудачу. Чтобы получать информацию об ошибке из mysql_errno() или mysql_error(), Вы должны обеспечить имеющий силу указатель на структуру MYSQL.
Меняет пользователя и заставляет базу данных, определенную как db, стать заданной по умолчанию (текущей) базой данных на подключении, определенном mysql. В последующих запросах эта база данных будет значением по умолчанию для ссылок на таблицы, которые не включают явный спецификатор базы данных.
Эта функция впервые была представлена в MySQL Version 3.23.3.
mysql_change_user() терпит неудачу, если указанный пользователь не может быть использован, или если он не имеет разрешения использовать эту базу данных. В этом случае пользователь и база данных не будут изменены вообще.
Параметр db может быть установлен в NULL, если Вы не хотите иметь заданную по умолчанию базу данных.
Переходит к произвольной строке в наборе результатов запроса. Это требует, чтобы структура набора результата содержала весь результат запроса, так что mysql_data_seek() может использоваться только в конъюнкции с mysql_store_result(), но никак не с mysql_use_result().
Смещение должно быть значением в диапазоне от 0 до mysql_num_rows(result)-1.
Делает DBUG_PUSH с заданной строкой. Вызов mysql_debug() использует библиотеку отладки Fred Fish. Чтобы использовать эту функцию, Вы должны компилировать библиотеку клиентов так, чтобы поддерживать отладку.
Инструктирует сервер, чтобы писать некоторую информацию отладки в файл регистрации. Отдавший команду пользователь должен иметь привилегию process, чтобы работать.
mysql_eof() определяет, читалась или нет последняя строка набора результатов.
Если Вы приобретаете результат из успешного обращения к mysql_store_result(), клиент получает весь набор в одной операции. В этом случае возврат NULL из mysql_fetch_row() всегда означает, что конец набора результатов был достигнут и не нужно вызвать mysql_eof().
С другой стороны, если Вы используете mysql_use_result(), чтобы инициализировать поиск набора результата, строки набора получены с сервера по одной, поскольку Вы вызываете mysql_fetch_row() неоднократно. Потому что ошибка может происходить на подключении в течение этого процесса, значение NULL из функции mysql_fetch_row() не обязательно означает, что конец набора результатов был достигнут. В этом случае, Вы можете использовать mysql_eof(), чтобы определить, что там случилось. Функция mysql_eof() возвращает значение, отличное от нуля, если конец набора результатов был достигнут и ноль, если произошла ошибка.
Исторически mysql_eof() предшествует стандартной функции MySQL mysql_errno() и mysql_error(). Так как те функции ошибки обеспечивают ту же самую информацию, их использование предпочтительнее mysql_eof(). Фактически, они обеспечивают большее количество информации потому, что mysql_eof() возвращает только булево значение, в то время как функции ошибки указывают причину.
Для подключения, определенного в mysql, mysql_errno() возвращает код ошибки для вызванной функции API, которая может сработать нормально или потерпеть неудачу. Значение возврата 0 означает, что никакой ошибки не произошло. Числа сообщений об ошибках клиента перечислены в файле заголовка MySQL errmsg.h. Серверные ошибки перечислены в mysqld_error.h. В дистрибутиве исходного кода MySQL Вы можете найти полный список сообщений об ошибках и их кодов в файле Docs/mysqld_error.txt.
Для подключения, определенного в mysql, mysql_error() возвращает сообщение об ошибках для вызванной функции API, которая может сработать нормально или потерпеть неудачу. Пустая строка вернется, если никакой ошибки не произошло. Это означает, что следующие тесты эквивалентны:
if (mysql_errno(&mysql)) { // an error occurred } if (mysql_error(&mysql)[0] != '\0') { // an error occurred }
Язык сообщений об ошибках пользователя может быть изменен перекомпиляцией библиотеки клиента MySQL. В настоящее время Вы можете выбирать сообщения об ошибках на нескольких различных языках.
Возвращает определение одного столбца набора результатов как структуру MYSQL_FIELD. Вызовите эту функцию неоднократно, чтобы собрать информацию относительно всех столбцов в наборе результатов. mysql_fetch_field() возвращает NULL, когда все поля уже обработаны или их не было вовсе.
mysql_fetch_field() будет сброшен так, чтобы возвратить информацию относительно первого поля каждый раз, когда Вы выполняете новый запрос SELECT. На поле, возвращенное mysql_fetch_field() также воздействуют обращения к mysql_field_seek().
Если Вы вызвали mysql_query() чтобы выполнить SELECT на таблице, но не вызвали mysql_store_result(), MySQL возвращает заданную по умолчанию длину blob (8K), если Вы вызываете mysql_fetch_field(), чтобы спросить о длине поля типа BLOB. Размер в 8K выбран потому, что MySQL не знает максимальную длину для BLOB. Это должно быть сделано с перестраиваемой конфигурацией когда-нибудь. Как только Вы получили набор результатов, field.max_length хранит длину самого большого значения для этого столбца в специфическом запросе.
Возвращает массив всех структур MYSQL_FIELD для набора результатов. Каждая структура обеспечивает определение поля для одного столбца набора результатов.
Получает код поля fieldnr для столбца внутри набора результатов, возвращает определение поля столбца как структура MYSQL_FIELD. Вы можете использовать эту функцию, чтобы получить описание для произвольного столбца. Значение fieldnr должно быть в диапазоне от 0 до mysql_num_fields(result)-1.
Возвращает длины столбцов текущей (актуальной) строки внутри набора результатов. Если Вы планируете копировать значения поля, эта информация также полезна для оптимизации потому, что Вы можете избежать вызова strlen(). Кроме того, если набор результатов содержит двоичные данные, Вы должны использовать эту функцию, чтобы определить размер данных потому, что функция strlen() возвращает неправильные результаты для любого поля, содержащего символы пробела.
Длина для пустых столбцов и для столбцов, содержащих значения NULL, равна нулю. Чтобы видеть, как отличить эти два случая, обратитесь к описанию mysql_fetch_row().
Получает следующую строку набора результатов. Когда используется после mysql_store_result(), mysql_fetch_row() возвращает NULL, когда не имеется больше строк, чтобы получить. Когда используется после mysql_use_result(), mysql_fetch_row() вернет NULL, когда не имеется больше строк, чтобы получить, или произошла ошибка.
Число значений в строке задано mysql_num_fields(result). Если row хранит значение возврата от обращения к mysql_fetch_row(), указатели на значения меняются с row[0] на row[mysql_num_fields(result)-1]. Значения NULL в строке обозначены указателями NULL.
Длины значений полей в строке могут быть получены, вызывая mysql_fetch_lengths(). Пустые поля и поля, содержащие NULL имеют длину 0. Вы можете отличать их, проверяя указатель для значения поля. Если указатель равен NULL, поле NULL, иначе поле пустое.
Возвращает число столбцов для самого последнего запроса на подключении.
Нормальное использование этой функции: когда mysql_store_result() возвращает NULL (и таким образом Вы не имеете никакого указателя на набор результатов). В этом случае Вы можете вызывать mysql_field_count(), чтобы определить, должен или нет mysql_store_result() произвести не пустой результат. Это позволяет программе пользователя выбрать соответствующее действие без того, чтобы знать, был или нет запрос SELECT (или SELECT-подобным). Пример, показанный ниже иллюстрирует, как это может быть выполнено.
Устанавливает курсор поля к данному смещению. Следующее обращение к mysql_fetch_field() получит определение поля столбца, связанного именно с этим смещением.
Чтобы перейти к началу строки, передайте 0 как значение offset.
Возвращает позицию курсора поля, используемого для последнего mysql_fetch_field(). Это значение может использоваться как параметр для mysql_field_seek().
Освобождает память, распределенную для набора результатов mysql_store_result(), mysql_use_result(), mysql_list_dbs() и другими подобными функциями. Когда Вы закончили работу с набором результатов, Вы должны освободить память, которую он использует, вызывая mysql_free_result().
Возвращает строку, которая представляет версию клиентской библиотеки.
Возвращает строку, описывающую тип используемого подключения, включая имя главного компьютера сервера.
Возвращает код версии протокола, используемой текущим подключением.
Возвращает строку, которая представляет номер версии сервера.
Возвращает строку, обеспечивающую информацию относительно недавно выполненного запроса, но только для инструкций, перечисленных ниже. Для других инструкций mysql_info() всегда возвращает NULL. Формат строки изменяется в зависимости от типа запроса, как описано ниже. Числа только иллюстративны: строка будет содержать значения, соответствующие запросу.
INSERT INTO ... SELECT ... Формат строки: Records: 100 Duplicates: 0 Warnings: 0 INSERT INTO ... VALUES (...),(...),(...)... Формат строки: Records: 3 Duplicates: 0 Warnings: 0 LOAD DATA INFILE ... Формат строки: Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 ALTER TABLE Формат строки: Records: 3 Duplicates: 0 Warnings: 0 UPDATE Формат строки: Rows matched: 40 Changed: 40 Warnings: 0
Обратите внимание, что mysql_info() возвращает значение не-NULL для инструкции INSERT ... VALUES только, если много списков значений было определено в инструкции.
Распределяет или инициализирует объект MYSQL, подходящий для mysql_real_connect(). Если mysql является указателем NULL, функция распределяет память, инициализирует и возвращает новый объект. Иначе объект будет просто инициализирован, и адрес объекта возвращен. Если mysql_init() распределяет новый объект, место будет освобождено, когда будет вызвана mysql_close().
Возвращает ID, сгенерированный предыдущим запросом для столбца с поддержкой AUTO_INCREMENT. Используйте эту функцию после того, как Вы выполнили запрос INSERT для таблицы, которая содержит поле AUTO_INCREMENT.
Обратите внимание, что mysql_insert_id() возвращает 0, если предыдущий запрос не генерирует значение AUTO_INCREMENT. Если Вы должны сохранить значение для последующего неспешного потребления убедитесь, что вызвали mysql_insert_id() немедленно после того запроса, который генерирует значение.
mysql_insert_id() модифицируется после инструкций INSERT и UPDATE, которые генерируют значение AUTO_INCREMENT, или установки значения столбца с помощью LAST_INSERT_ID(expr).
Также обратите внимание, что значение функции SQL LAST_INSERT_ID() всегда содержит самое последнее сгенерированное значение AUTO_INCREMENT, и оно не будет сброшено между запросами потому, что значение этой функции поддерживается сервером.
Просит, чтобы сервер уничтожил поток, определенный как pid.
Возвращает набор результатов, состоящий из имен баз данных на сервере, которые соответствуют простому регулярному выражению, определенному параметром wild. Здесь wild может содержать групповые символы % или _, или может быть NULL, чтобы соответствовать всем базам данных. Вызов mysql_list_dbs() подобен выполнению запроса SHOW databases [LIKE wild].
Вы должны освободить набор результатов с помощью mysql_free_result().
Возвращает набор результатов, состоящий из имен полей в данной таблице, которые соответствуют простому регулярному выражению, определенному параметром wild. Здесь wild может содержать групповые символы % или _, или может быть NULL, чтобы соответствовать всем полям. Вызов mysql_list_fields() подобен выполнению запроса SHOW COLUMNS FROM tbl_name [LIKE wild].
Обратите внимание, что рекомендуется, чтобы Вы использовали SHOW COLUMNS FROM tbl_name вместо mysql_list_fields().
Вы должны освободить набор результатов с помощью mysql_free_result().
Возвращает набор результатов, описывающий текущие потоки сервера. Это тот же самый вид информации, что и сообщаемый командой mysqladmin processlist или запросом SHOW PROCESSLIST.
Вы должны освободить набор результатов с помощью mysql_free_result().
Возвращает набор результатов, состоящий из имен таблиц в текущей базе данных, которые соответствуют простому регулярному выражению, определенному параметром wild. Здесь wild может содержать групповые символы % или _, или может быть NULL, чтобы соответствовать всем таблицам. Вызов mysql_list_tables() подобен выполнению запроса SHOW tables [LIKE wild].
Вы должны освободить набор результатов с помощью mysql_free_result().
Возвращает число столбцов в наборе результатов.
Обратите внимание, что Вы можете получать число столбцов из указателя набора результатов или от дескриптора подключения. Вы используете дескриптор подключения, если mysql_store_result() или mysql_use_result() возвращает NULL (и таким образом Вы не имеете никакого указателя набора результата). В этом случае Вы можете вызывать mysql_field_count() чтобы определить, должен или нет mysql_store_result() произвести непустой результат. Это позволяет программе пользователя выбрать соответствующее действие без того, чтобы знать, был или нет запрос SELECT (или SELECT-подобным). Пример, показанный ниже иллюстрирует, как это может быть выполнено.
Возвращает число строк в наборе результатов.
Использование mysql_num_rows() зависит от того, используете ли Вы mysql_store_result() или mysql_use_result(), чтобы получить набор результатов. Если Вы используете mysql_store_result(), mysql_num_rows() может быть вызван немедленно. Если Вы используете mysql_use_result(), mysql_num_rows() не будет возвращать правильное значение, пока все строки в наборе результатов не будут получены.
Может использоваться, чтобы установить дополнительные параметры связи и действует на поведение подключения. Эта функция может быть вызвана несколько раз, чтобы установить несколько параметров.
mysql_options() должна быть вызвана после mysql_init(), но перед mysql_connect() или mysql_real_connect().
Параметр option представляет собой опцию, которую Вы хотите устанавливать, arg задает значение для опции. Если опция целое число, то arg должен указывать на значение целого числа.
Возможные значения параметров:
Опция | Тип аргумента | Действие |
MYSQL_OPT_CONNECT_TIMEOUT | longword | Время ожидания в секундах. |
MYSQL_OPT_COMPRESS | TMY_BOOL | Использовать сжатый протокол клиент-сервер. |
MYSQL_OPT_NAMED_PIPE | TMY_BOOL | Использовать именованные каналы, чтобы соединиться с сервером MySQL под NT. |
MYSQL_INIT_COMMAND | PCHAR | Команда, чтобы выполнить при соединении с сервером MySQL. Будет автоматически выполнена при повторном соединении. |
MYSQL_READ_DEFAULT_FILE | PCHAR | Читать параметры из указанного файла опций вместо my.cnf. |
MYSQL_READ_DEFAULT_GROUP | PCHAR | Читать параметры из именованной группы из файла опций my.cnf или файла, определенного в MYSQL_READ_DEFAULT_FILE. |
Обратите внимание, что группа client всегда читается, если Вы используете MYSQL_READ_DEFAULT_FILE или MYSQL_READ_DEFAULT_GROUP.
Определенная группа в файле опций может содержать следующие параметры:
connect_timeout | Время ожидания в секундах. В Linux это время ожидания также используется для ожидания первого ответа. |
compress | Использовать сжатый протокол клиент-сервер. |
database | Соединиться с этой базой данных, если никакая база данных не была определена в команде подключения. |
debug | Опции для отладки. |
host | Имя сервера по умолчанию. |
init-command | Команда, чтобы выполнить при соединении с сервером MySQL. Будет автоматически заново выполнена при повторном соединении, если связь прервалась. |
interactive-timeout | Аналогично указанию опции CLIENT_INTERACTIVE в mysql_real_connect(). |
password | Пароль по умолчанию. |
pipe | Использовать именованные каналы, чтобы соединиться с сервером MySQL, работая под NT. |
port | Порт по умолчанию. |
return-found-rows | Сообщить mysql_info() о том, что нужно возвратить найденные строки вместо модифицируемых строк при использовании UPDATE. |
socket | Сокет по умолчанию. |
user | Пользователь по умолчанию. |
Обратите внимание, что timeout был заменен на connect_timeout, но timeout будет все еще работать некоторое время для совместимости.
Проверяет работает или нет подключение. В случае неработоспособности будет предпринято автоматическое переподключение.
Эта функция может использоваться клиентом, который долго простаивает, чтобы определить, закрыл или нет сервер подключение, и повторно соединиться с ним в случае необходимости.
Выполняет запрос SQL, указанный строкой с нулевым символом в конце. Запрос должен состоять из одиночной инструкции SQL. Вы не должны добавлять точку с запятой (;) или \g для завершения запроса.
mysql_query() не может использоваться для запросов, которые содержат двоичные данные, взамен Вы должны использовать mysql_real_query(). Двоичные данные могут содержать в себе символ \0, который mysql_query() интерпретирует как конец строки запроса. Если Вы хотите знать, возвратил ли запрос набор результатов или нет, Вы можете использовать mysql_field_count(), чтобы проверить это.
mysql_real_connect() пытается установить подключение с сервером MySQL, запущенным на машине host. mysql_real_connect() должен завершиться успешно прежде, чем Вы сможете выполнить любую из других функций API, за исключением mysql_get_client_info().
Параметры определены следующим образом:
Первый параметр должен быть адресом существующей структуры типа TMYSQL. Перед вызовом mysql_real_connect() Вы должны вызвать mysql_init(), чтобы инициализировать структуру TMYSQL. Вы можете изменять много параметров подключения через вызов mysql_options(). Значением host может быть имя или адрес IP. Если это NULL или строка localhost, выполняется подключение к локальной системе. Если OS поддерживает сокеты (Unix) или именованные каналы (Windows), именно они используются вместо стека протоколов TCP/IP, чтобы соединиться с сервером. Аргумент user содержит ID пользователя MySQL. Если user равен NULL, предполагается текущий пользователь. Под Unix это текущее (актуальное) имя входа в систему. Под Windows ODBC имя пользователя должно быть определено явно! Параметр passwd содержит пароль для user. Если passwd равен NULL, только записи в таблице user, которые имеют пустое поле пароля, будут проверены на соответствие. Это позволяет администратору базы данных устанавливать систему привилегий MySQL таким способом, которым пользователи получают различные привилегии в зависимости от того, определили или нет они пароль. ОБРАТИТЕ ВНИМАНИЕ: Не пытайтесь шифровать пароль перед вызовом mysql_real_connect(): шифрование пароля обработано автоматически.
db задает имя базы данных. Если db не NULL, подключение установит заданную по умолчанию базу данных. Если port не равен 0, значение будет использоваться как номер порта для подключения по TCP/IP. Обратите внимание, что параметр host определяет тип подключения. Если unix_socket не равен NULL, строка определяет сокет или именованный канал, который должен использоваться. Обратите внимание, что параметр host определяет тип подключения. Значение client_flag как правило равно 0, но может быть установлено к комбинации из следующих флажков в специальных обстоятельствах:
Имя флажка | Что он делает |
CLIENT_COMPRESS | Использовать протокол сжатия. |
CLIENT_FOUND_ROWS | Возвратить число найденных, а не обработанных строк. |
CLIENT_IGNORE_SPACE | Позволить использовать пробелы после имен функций. Делает все зарезервированные слова именами функций. |
CLIENT_INTERACTIVE | Позволить interactive_timeout секунд (вместо wait_timeout секунд) бездеятельности перед закрытием подключения. |
CLIENT_NO_SCHEMA | Не позволять синтаксис db_name.tbl_name.col_name. Это сделано для ODBC. Это заставляет синтаксический анализатор генерировать ошибку, если Вы используете тот синтаксис, который является полезным для заманивания в ловушку ошибок в некоторых программах ODBC. |
CLIENT_ODBC | Работает клиент ODBC. |
CLIENT_SSL | Использовать шифрованный протокол SSL. |
Эта функция используется, чтобы создать допустимую строку, которую Вы можете использовать в инструкции SQL.
Строка в from бужет закодирована до экранированной строки SQL, принимая во внимание текущий (актуальный) набор символов подключения. Результат будет помещен в to и завершающий байт пустого указателя допишется автоматически. Символы NUL (ASCII 0), \n, \r, \, ', ", а также Control-Z, будуь экранированы.
Строка, указанная в from должна быть length байтов длины. Вы должны распределить буфер по крайней мере length*2+1 байт. В худшем случае каждый символ должен быть закодирован как использование двух байтов, и Вы нуждаетесь в участке памяти для завершающего байта пустого указателя. Когда mysql_escape_string() завершится, в to будет строка с нулевым байтом в конце. Значение возврата: длина закодированной строки, не включая символ завершения.
Выполняет запрос SQL, указанный в query, который должен быть строкой длиной в length байт. Запрос должен состоять из одиночной инструкции SQL. Вы не должны добавлять точку с запятой (`;') или \g для завершения запроса.
Вы должны использовать mysql_real_query() вместо mysql_query() для запросов, которые содержат двоичные данные, потому, что двоичные данные могут сами содержать символ \0. Кроме того, mysql_real_query() быстрее, чем mysql_query() потому, что не вызывает strlen().
Если Вы хотите знать, возвратил ли запрос набор результатов или нет, Вы можете использовать mysql_field_count(), чтобы проверить это.
Описание функций API
В описаниях ниже параметр или значение возврата NULL означает NULL в смысле языка программирования C, а не MySQL-значение NULL.
Функции, которые возвращают значение, возвращают указатель или целое число. Если не определено иное, функции, возвращающие указатель, возвращают значение не-NULL, чтобы указать успех, или значение NULL, чтобы указать ошибку, а функции, возвращающие число, возвращают целочисленный ноль, чтобы указать успех, или отличное от нуля значение, чтобы указать ошибку. Обратите внимание, что "отличное от нуля" означает только это. Если функциональное описание не говорит иного, не надо проверять результат на соответствие каким-либо числам, кроме нуля.
if (result) /* правильно */ ... error ...
if (result < 0) /* неправильно */ ... error ...
if (result = -1) /* неправильно */ ... error ...
Когда функция возвращает ошибку, подраздел Ошибки описания функции вносит в список возможные типы ошибок. Вы можете выяснить, который из них произошел, вызывая mysql_errno(). Представление строки ошибки может быть получено, вызывая mysql_error().
Ошибки
Аналогично mysql_real_connect().
CR_COMMANDS_OUT_OF_SYNC Команды были выполнены в неподходящем порядке. CR_SERVER_GONE_ERROR Сервер MySQL занят. CR_SERVER_LOST Подключение было потеряно в течение запроса. CR_UNKNOWN_ERROR Произошла неизвестная ошибка. ER_UNKNOWN_COM_ERROR Сервер MySQL не выполняет эту команду (вероятно, старая версия). ER_ACCESS_DENIED_ERROR Пользователь или пароль ошибочен. ER_BAD_DB_ERROR База данных не существует. ER_DBACCESS_DENIED_ERROR Пользователь не имеет прав доступа к базе данных. ER_WRONG_DB_NAME Имя базы данных слишком длинное.
CR_COMMANDS_OUT_OF_SYNC Команды были выполнены в неподходящем порядке. CR_SERVER_GONE_ERROR Сервер MySQL занят. CR_SERVER_LOST Подключение было потеряно в течение запроса. CR_UNKNOWN_ERROR Произошла неизвестная ошибка.
CR_COMMANDS_OUT_OF_SYNC Команды были выполнены в неподходящем порядке. CR_SERVER_GONE_ERROR Сервер MySQL занят. CR_SERVER_LOST Подключение было потеряно в течение запроса. CR_UNKNOWN_ERROR Произошла неизвестная ошибка.
CR_COMMANDS_OUT_OF_SYNC Команды были выполнены в неподходящем порядке. CR_SERVER_GONE_ERROR Сервер MySQL занят. CR_SERVER_LOST Подключение было потеряно в течение запроса. CR_UNKNOWN_ERROR Произошла неизвестная ошибка.
mysql_fetch_lengths() имеет силу только для текущей строки набора результатов. Этот вызов возвращает NULL, если Вы вызываете его перед mysql_fetch_row() или после получения всех строк в результате.
CR_SERVER_LOST Подключение было потеряно в течение запроса. CR_UNKNOWN_ERROR Произошла неизвестная ошибка.
Почему при успехе mysql_query() вызов mysql_store_result() иногда возвращает NULL?
Когда это случается, это означает, что одно из следующего произошло:
Имелся сбой malloc() (например, если набор результатов был слишком большой). Данные не могли прочитаться (произошла ошибка на подключении). Запрос не возвратил никакие данные (например, это был INSERT, UPDATE или DELETE).
Вы можете всегда проверить, должна или нет инструкция произвести непустой результат, вызывая mysql_field_count(). Если mysql_field_count() вернет ноль, результат пуст, и последний запрос был инструкцией, которая не возвращает значения (например, INSERT или DELETE). Если mysql_field_count() вернет не ноль, инструкция должна была произвести не пустой результат.
Вы можете проверить наличие ошибки вызовом mysql_error() или mysql_errno().
показанное ниже, заставляет библиотеку клиентов
Обращение, показанное ниже, заставляет библиотеку клиентов генерировать файл трассировки /tmp/client.trace на машине пользователя:
mysql_debug("d:t:O,/tmp/client.trace");
Типы данных в DELPHI API
TMYSQL Эта структура представляет дескриптор на одно подключение базы данных. Это используется почти для всех функций MySQL. TMYSQL_RES Эта структура представляет результат запроса, который возвращает строки (SELECT, SHOW, DESCRIBE, EXPLAIN). Информация, возвращенная из запроса, названа набором результатов в остатках от этого раздела. TMYSQL_ROW Это тип-безопасное представление одной строки данных. Это в настоящее время выполнено как массив байтовых строк. Вы не можете обрабатывать их как обычные строки с нулевым символом в конце, если значения поля могут содержать двоичные данные потому, что такие значения могут содержать нулевые символы в себе. Строки получены, вызывая функцию mysql_fetch_row(). TMYSQL_FIELD Эта структура содержит информацию относительно поля, например, имя поля, тип и размер. Члены описаны более подробно ниже. Вы можете получать структуры TMYSQL_FIELD для каждого поля, неоднократно вызывая mysql_fetch_field(). Значения полей не являются частью этой структуры, они содержатся в структуре TMYSQL_ROW. TMYSQL_FIELD_OFFSET Это тип-безопасное представление смещения в списке полей MySQL. Используются в вызове mysql_field_seek(). Смещения представляют собой номера полей внутри строки, начиная с нуля. Tmy_ulonglong Тип, используемый для числа строк и для функций mysql_affected_rows(), mysql_num_rows() и mysql_insert_id(). Этот тип обеспечивает диапазон от 0 до 1.84e19. На некоторых системах попытка печатать значение типа Tmy_ulonglong не будет работать. Чтобы отпечатать такое значение, преобразуйте его к типу longint.
Структура TMYSQL_FIELD содержит члены, перечисленные ниже:
name:pchar; Имя поля, как строка с нулевым символом в конце. table:pchar; Имя таблицы, содержащей это поле, если это не расчетное поле. Для расчетных полей, значение table представлено пустой строкой. def:pchar; Значение по умолчанию этого поля, как строка с нулевым символом в конце. Это установлено только, если Вы используете mysql_list_fields(). typ:TFIELD_TYPES; Тип поля. Значение typ может быть один из следующего:
Значение Typ | Используемый тип |
FIELD_TYPE_TINY | TINYINT |
FIELD_TYPE_SHORT | SMALLINT |
FIELD_TYPE_LONG | INTEGER |
FIELD_TYPE_INT24 | MEDIUMINT |
FIELD_TYPE_LONGLONG | BIGINT |
FIELD_TYPE_DECIMAL | DECIMAL или NUMERIC |
FIELD_TYPE_FLOAT | FLOAT |
FIELD_TYPE_DOUBLE | DOUBLE или REAL |
FIELD_TYPE_TIMESTAMP | TIMESTAMP |
FIELD_TYPE_DATE | DATE |
FIELD_TYPE_TIME | TIME |
FIELD_TYPE_DATETIME | DATETIME |
FIELD_TYPE_YEAR | YEAR |
FIELD_TYPE_STRING | Строка (CHAR или VARCHAR) |
FIELD_TYPE_BLOB | BLOB или TEXT (используйте max_length, чтобы определить максимальную длину поля) |
FIELD_TYPE_SET | SET |
FIELD_TYPE_ENUM | ENUM |
FIELD_TYPE_NULL | NULL |
FIELD_TYPE_CHAR | Не рекомендуется: используйте FIELD_TYPE_TINY |
length:longword; Ширина поля, как она определена в описании таблицы. max_length:longword; Максимальная ширина поля для набора результатов (длина самого длинного поля для строк в наборе результатов). Если Вы используете mysql_store_result() или mysql_list_fields(), это содержит максимальную длину поля. Если Вы используете mysql_use_result(), значение этой переменной нулевое. flags:longword; Различные биты задают флажки для поля. Значение flags может иметь ноль или большее количество из следующего набора битов:
Значение Flags | Что это значит |
NOT_NULL_FLAG | Поле не может быть NULL |
PRI_KEY_FLAG | Поле часть первичного ключа |
UNIQUE_KEY_FLAG | Поле часть уникального ключа |
MULTIPLE_KEY_FLAG | Поле часть неуникального ключа |
UNSIGNED_FLAG | Поле имеет атрибут UNSIGNED |
ZEROFILL_FLAG | Поле имеет атрибут ZEROFILL |
BINARY_FLAG | Поле имеет атрибут BINARY |
AUTO_INCREMENT_FLAG | Поле имеет атрибут AUTO_INCREMENT |
ENUM_FLAG | Поле имеет тип ENUM |
BLOB_FLAG | Поле имеет тип BLOB или TEXT |
TIMESTAMP_FLAG | Поле имеет тип TIMESTAMP |
IS_NOT_NULL(flags) | Истина, если это поле определено как NOT NULL |
IS_PRI_KEY(flags) | Истина, если это поле первичный ключ |
IS_BLOB(flags) | Истина, если это поле BLOB или TEXT |
Возвращаемые значения
Целое число, большее, чем ноль, указывает количество обработанных строк. Ноль указывает, что никакие записи обработаны не были. -1 указывает, что запрос возвратил ошибку или то, что для запроса SELECT mysql_affected_rows() был вызван до вызова mysql_store_result().
Если определен флажок CLIENT_FOUND_ROWS, при соединение с mysqld mysql_affected_rows() возвратит число строк, согласованных инструкцией WHERE для UPDATE.
Обратите внимание, что, когда использована команда REPLACE, mysql_affected_rows() вернет 2 потому, что в этом случае одна строка была вставлена, а затем дубликат был удален.
Ноль для успеха. Отличное от нуля, если произошла ошибка.
Ноль, если база данных была создана успешно. Отличное от нуля, если в процессе произошла ошибка.
Ноль, если база данных была удалена успешно. Отличное от нуля, если в процессе произошла ошибка.
Ноль, если команда была успешно выполнена. Отличное от нуля, если в процессе произошла ошибка.
Функция mysql_eof() возвращает значение, отличное от нуля, если конец набора результатов был достигнут и ноль, если произошла ошибка.
Значение кода ошибки. 0, если никакая ошибка не произошла.
Символьная строка, которая описывает ошибку. Пустая строка, если никакой ошибки не произошло.
Структура типа MYSQL_FIELD для текущего (актуального) столбца. NULL, если никакие столбцы не обработаны.
Массив структур MYSQL_FIELD для всех столбцов набора результатов.