Python: доступ к базе данных MySQL без модуля MySQLdb - PullRequest
2 голосов
/ 22 февраля 2010

Есть ли другой способ подключения к базе данных MySQL с помощью того, что было включено в версию Python (2.5.1), которая поставляется в комплекте с Mac OS 10.5.x? К сожалению, я не могу добавить модуль MySQLdb на клиентские машины, с которыми я работаю ... Мне нужно работать со стандартной версией Python, поставляемой с Leopard.

Ответы [ 4 ]

8 голосов
/ 22 февраля 2010

Почему бы не установить пользовательскую (не системную) копию MySQLdb? Это файлы , которые вам нужно установить:

/usr/lib/pyshared/python2.6
/usr/lib/pyshared/python2.6/_mysql.so
/usr/share/pyshared
/usr/share/pyshared/MySQLdb
/usr/share/pyshared/MySQLdb/constants
/usr/share/pyshared/MySQLdb/constants/CLIENT.py
/usr/share/pyshared/MySQLdb/constants/REFRESH.py
/usr/share/pyshared/MySQLdb/constants/FLAG.py
/usr/share/pyshared/MySQLdb/constants/FIELD_TYPE.py
/usr/share/pyshared/MySQLdb/constants/__init__.py
/usr/share/pyshared/MySQLdb/constants/ER.py
/usr/share/pyshared/MySQLdb/constants/CR.py
/usr/share/pyshared/MySQLdb/__init__.py
/usr/share/pyshared/MySQLdb/cursors.py
/usr/share/pyshared/MySQLdb/times.py
/usr/share/pyshared/MySQLdb/connections.py
/usr/share/pyshared/MySQLdb/converters.py
/usr/share/pyshared/MySQLdb/release.py
/usr/share/pyshared/_mysql_exceptions.py

Даже если вы не можете установить в / usr / lib и / usr / share / pyshared, вы можете установить его где-нибудь еще, если он находится в каталоге, указанном в PYTHONPATH клиента.

Если по какой-либо причине установка пользовательской копии MySQLdb не является опцией, вы можете сделать следующее, хотя и предупреждайте: это ужасный способ взаимодействия с mysqld по причинам, которые я перечислю ниже:

Откройте терминал и наберите что-то вроде

mysql -u USER -pPASSWORD -D DATABASE -Bse "select * from table;"

-B tells mysql to run in "batch" mode
-s tells mysql to run in "silent" mode
-e tells mysql to execute the following statement

Если это работает, то вы могли бы использовать модуль subprocess Python для вызова mysql команд (таких как приведенная выше).

Например,

import subprocess
user='xxxxxx'
password='xxxxxxxx'
database='xxxxxxxx'
cmd=['mysql', '-u', user, '-p%s'%password, '-D', database, '-Bse', "select * from table;"]
proc=subprocess.Popen(cmd,stdout=subprocess.PIPE)
retval=proc.communicate()[0]
print(retval)

Как уже упоминалось выше, вы многое теряете, делая это. А именно

  1. retval - это просто гигантская нить. Вы теряете всю информацию о том, где поля и записи начинаются и заканчиваются,
  2. вы теряете автоматическое преобразование в типы данных Python,
  3. вы теряете информационные ошибки исключения.
2 голосов
/ 25 февраля 2010

Или вы можете проверить MySQL Connector / Python . Он все еще находится в разработке, но должен работать с Python 2.5. Библиотеки MySQL или другое программное обеспечение не требуется.

1 голос
/ 07 февраля 2012

Если проблема заключается в невозможности, как уже упоминали многие люди, то проблема заключается в том, что модуль msqldb является более простым способом. 1. установить базу данных mysql 2. установить модуль pyodbc 3. Загрузите и настройте драйвер odbc mysql 4. выполнить sql манипуляции с pyodbc, который очень зрелый и полностью функциональный.

надеюсь, это поможет

0 голосов
/ 23 февраля 2010

Вы можете упростить анализ данных, возвращаемых пакетным вызовом командной строки в MySQL, используя os.popen () вместо subprocess.call () и изменив запрос в команде.

  • Удаление команды в os.popen (cmd) .readlines () возвращает вывод в виде списка возвращаемых строк с записями, разделенными символом табуляции.
  • mysql параметр '-e' вместо '-Bse' возвращает запись или строку с именами возвращенных полей.

Вывод теперь может быть помещен в список словарей, заданных по именам полей таблицы:

import os    
res = os.popen(cmd).readlines()
dicts = [dict(zip(res[0].split('\t'), record.split('\t'))) for record in res[1:]]

Предостережения:

  • Значения по умолчанию в установках mysql для разделителей полей могут отличаться. Чтобы гарантировать (или знать) непротиворечивый символ-разделитель, вы могли бы взаимодействовать с установкой mysql, чтобы установить (или обнаружить) его значение по умолчанию.
  • Возможно, вам придется повторить командную строку, переданную os.popen в виде строки, я не знаю, поддерживает ли os.popen представление объектов списка в качестве аргументов.
  • Это работало на Linux-коробке. Я не знаю, почему Mac был бы другим.
  • Я всего лишь яйцо и не могу комментировать преимущества subprocess.call () перед os.popen (). Я прочитал, что popen () открывает другой процесс, и что его двоюродная сестра os.system блокирует вызывающего до тех пор, пока на него не ответят.

Это просто убирает взлом. Возможно, вам все же лучше найти способ использовать MySQLdb или что-то подобное для другой базы данных.

UPDATE: Справочник по библиотеке Python предлагает еще несколько возможностей.
- Если вы действительно хотите видеть ошибки или предупреждения, отправленные на стандартную ошибку mysql, используйте popen3.
- В документации Python упоминается popen4, который «выполняет cmd как подпроцесс». Можно ли обойти проблемы с блокировкой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...