是否有另一种方法可以连接到MySQL数据库,其中包含与Mac OS 10.5.x捆绑在一起的Python(2.5.1)版本中包含的内容?遗憾的是,我无法将MySQLdb模块添加到我正在使用的客户端计算机中......我需要使用Leopard附带的Python版本。
答案 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)
如上所述,这样做会让你失去很多。即,
retval
只是一个巨大的字符串。您将丢失有关字段和记录开始和结束位置的所有信息,
答案 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上命令行批处理调用返回的数据的解析,并在命令中修改查询。
现在可以将输出放入键控在表字段名称上的词典列表中:
import os
res = os.popen(cmd).readlines()
dicts = [dict(zip(res[0].split('\t'), record.split('\t'))) for record in res[1:]]
注意事项:
这只是清理黑客。您可能仍然更好地找到一种方法来使用MySQLdb,或类似的另一个数据库。
更新: Python库参考提供了更多可能性 - 如果你真的想看到mysql发送给标准错误的错误或警告,请使用popen3 - Python文档提到了popen4,它“将cmd作为子进程执行”。可以解决阻塞问题吗?