Python:访问没有MySQLdb模块的MySQL数据库

时间:2010-02-22 18:54:20

标签: python mysql macos

是否有另一种方法可以连接到MySQL数据库,其中包含与Mac OS 10.5.x捆绑在一起的Python(2.5.1)版本中包含的内容?遗憾的是,我无法将MySQLdb模块添加到我正在使用的客户端计算机中......我需要使用Leopard附带的Python版本。

4 个答案:

答案 0 :(得分:8)

为什么不安装MySQLdb的用户(非系统)副本? 这些是你需要安装的the files

/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

如果这样可行,那么可以使用python的subprocess模块来调用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. 您将丢失信息性错误异常。

答案 1 :(得分:2)

或者您可以查看MySQL Connector/Python。它仍在开发中,但应该与Python 2.5一起使用。无需MySQL库或其他软件。

答案 2 :(得分:1)

如果问题是无能为力,就像许多人提到的那样,msqldb模块是一个问题,更简单的方法是 1.安装mysql db 2.安装pyodbc模块 3.加载并配置odbc mysql驱动程序 4.使用pyodbc执行sql操作,这非常成熟且功能齐全。

希望这会有所帮助

答案 3 :(得分:0)

您可以使用os.popen()而不是subprocess.call()来简化对mysql上命令行批处理调用返回的数据的解析,并在命令中修改查询。

  • 将命令放入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会有所不同。
  • 我只是一个鸡蛋,不能在os.popen()上评论subprocess.call()的优点。我读到popen()打开另一个进程,它的堂兄os.system阻止调用者直到回答。

这只是清理黑客。您可能仍然更好地找到一种方法来使用MySQLdb,或类似的另一个数据库。

更新: Python库参考提供了更多可能性   - 如果你真的想看到mysql发送给标准错误的错误或警告,请使用popen3   - Python文档提到了popen4,它“将cmd作为子进程执行”。可以解决阻塞问题吗?