如何通过ODBC用Python连接MySQL

1 投票
3 回答
14128 浏览
提问于 2025-04-16 09:48

我在 Fedora 14 x64 上运行 mysql、pyodbc 和 Python 2.7。

Odbcinst.ini 文件内容是:

# Example driver definitions

# Driver from the postgresql-odbc package
# Setup from the unixODBC package
#[PostgreSQL]
#Description    = ODBC for PostgreSQL
#Driver     = /usr/lib/psqlodbc.so
#Setup      = /usr/lib/libodbcpsqlS.so
#Driver64   = /usr/lib64/psqlodbc.so
#Setup64    = /usr/lib64/libodbcpsqlS.so
#FileUsage  = 1


# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
#Driver     = /usr/lib/libmyodbc5.so
#Setup      = /usr/lib/libodbcmyS.so
Driver64    = /usr/lib64/libmyodbc5.so
Setup64     = /usr/lib64/libodbcmyS.so
FileUsage   = 1

Odbc.ini 文件内容是:

[MySQL]
Driver = MySQL
Database = mysql
Server = localhost
Socket = /var/lib/mysql/mysql.sock
User = rooter
Password = sshh

Mysql.sock 文件是空的?

/var/lib/mysql/mysql.sock 的大小是 0.B

我的 Python 脚本是:

import pyodbc

#pyodbc.pooling = False 
conn = pyodbc.connect('DRIVER={MySQL};SOCKET=/var/lib/mysql/mysql.sock;UID=rooter;PWD=sshh') 

csr = conn.cursor()
csr.execute("SET GLOBAL event_scheduler = ON")
csr.close()

conn.close() 
del csr

我似乎无法用上面的脚本连接,使用 isql 的时候可以连接成功!

我的错误信息:

Traceback (most recent call last):
  File "/CCX/Py/MySql Event OFF.py", line 4, in <module>
    conn = pyodbc.connect('DRIVER={MySQL};SOCKET=/var/lib/mysql/mysql.sock;UID=rooter;PWD=sshh') 
pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnectW)')

在 Win XP x64 上:

#cxn = MySQLdb.connect (host = "localhost",user="rooter",passwd ="sshh")

错误信息:

File "C:\Python26\lib\site-packages\MySQLdb\__init__.py", line 19, in <module>
    import _mysql
ImportError: DLL load failed: %1 is not a valid Win32 application.

3 个回答

1

来源: http://mysql-python.sourceforge.net/MySQLdb.html#some-mysql-examples

测试过的代码:

import _mysql

conn=_mysql.connect(host="localhost", user="root", passwd="***", db="test")
conn.query("select * from test_table")
result = conn.use_result()

print result.fetch_row()

fetch_row()这个函数有两个参数:

  1. maxrows用来限制返回的最大行数。
  2. how:当how=0时,它返回一个元组;当how=1时,它返回一个字典。

举个例子,result.fetch(maxrows=5, how=1)会返回一个数组(最大大小为5),这个数组里的每个元素都是一个字典,字典的键是列名,值是对应的列值。

1

在"C:\Python26\lib\site-packages\MySQLdb__init__.py"这个文件的第19行,出现了一个错误:导入失败,提示DLL加载失败:%1 不是一个有效的Win32应用程序。

如果你使用的是Python 2.6版本并且是在Windows系统上,

你需要下载三个文件:libguide40.dll、libmmd.dll和libmySQL.dll。

把这三个文件放到C:\Python26\Lib\site-packages文件夹里,

同时也要把这三个文件放到C:\Windows\system32文件夹里,

然后重启你的电脑。

如果你使用的是Python 2.7版本并且是在Windows系统上,

在安装模块的时候,要注意版本,

你需要选择这两个文件中的一个:MySQL-python-1.2.3.win32-py2.7.exe或者MySQL-python-1.2.4.win32-py2.7.exe。

2

比较一下 odbcinst.ini 和你的 odbc.ini 文件,发现 odbc.ini 中的驱动值有点奇怪,你这里应该有一个动态库(我觉得是这样的)。

还有,为什么不直接 使用 MySQL 连接(不通过 odbc)呢? :

import _mysql

conn = _mysql.connect(host="localhost", user="rooter", 
                      password="sshh", db="mysql") 
conn.query("SET GLOBAL event_scheduler = ON")
conn.close() 

(未测试)

撰写回答