pyodbc 和 mySQL

Posted

技术标签:

【中文标题】pyodbc 和 mySQL【英文标题】:pyodbc and mySQL 【发布时间】:2011-04-28 06:51:35 【问题描述】:

我无法使用 pyodbc 连接到 mysql db。

这是我的脚本的 sn-p:

import pyodbc
import csv

cnxn = pyodbc.connect("DRIVER=MySQL ODBC 3.51 Driver; SERVER=localhost;DATABASE=mydb; UID=root; PASSWORD=thatwouldbetelling;") 
crsr = cnxn.cursor()

with open('C:\\skunkworks\\archive\\data\\myfile.csv','r') as myfile:
    rows = csv.reader(myfile, delimiter=',', quotechar='"')
    for row in rows:
        insert_str = 'INSERT into raw_data VALUES(something, something)'
        print insert_str
        #crsr.execute(insert_str)
    cnxn.commit()
    myfile.close()

我在 pyodbc.connect() 行收到此错误:

pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC 驱动程序管理器] 数据 未找到源名称且没有默认值 指定驱动程序 (0) (SQLDriverConnectW)')

我对这个错误(以及一般的 Python 脚本)还有另一个问题。当我将其作为脚本运行时,它会静默失败(我期待堆栈跟踪)。我必须手动输入每一行才能找到错误发生的位置。

我现在有点懒(没有异常处理)——没有异常处理的 Python 脚本的这种正常行为是否会静默失败?

[编辑]

我没有使用 mysqldb,因为我已经在使用 pyodbc 从另一个源 (MS Access) 提取我的数据。好吧,这不是一个很好的理由 - 但我已经在努力解决 pyodbc 问题,而且我真的不想为了“一次性”工作而不得不与另一个库/模块/包(无论它在 Python 中调用什么)搏斗。我只想将我的数据从 Windows 环境中的各种数据源移动到 Linux 上的 mySQl。一旦在 Linux 上,我将回到 terra Firma。

这就是整个“脚本”。我刚刚将上面的代码保存到一个扩展名为 .py 的文件中,然后在命令行运行 python myscript.py。我在我的 XP 机器上运行它

【问题讨论】:

你为什么不用mysqldb驱动? “当我将它作为脚本运行时”?你实际上做了什么?请提供一些关于你做了什么的提示。什么操作系统?什么壳牌? “我真的不想为了一份“一次性”工作而不得不与另一个库/模块/包(无论它在 Python 中叫什么)搏斗”这违反了 Python 的世界观。似乎我们所做的只是下载新包并与它们搏斗。将包用于其预期目的很重要。 pyodbc 可能无法连接到 MySQL。期间。 查看 Python 应用程序可用的 ODBC 驱动程序的最佳方法是检查调用 pyodbc.drivers() 返回的列表。 【参考方案1】:

我也犯了同样的错误,所以我检查了我用于连接的所有版本。这是我发现的:

对于 Python 2.7 32 位: - pyodbc 必须是 32 位 - 数据库驱动程序必须是 32 位的。 (Microsoft Access 也应该是 32 位的)

适用于使用 64 位版本的用户。您也应该检查所有内容都是 64 位的。

在我的例子中,我试图连接到 Oracle DB 和 Microsoft Access DB,因此我必须使以下组件与架构版本相匹配:

pyodbc(MS 访问) 蟒蛇 cx_Oracle(用于 SQLalchemy 的 Oracle 方言) Oracle 即时客户端基本版(Oracle。不要忘记创建环境变量) py2exe(制作可执行应用)

【讨论】:

那是给我的!!非常感谢,这可能又浪费了 10 个小时……我只需要安装 32 位版本的驱动程序,64 位 dsn 变成 32/64 并且正在连接。 pyobc、python、db driver等使用什么命令来查找它是32位还是64位?【参考方案2】:

MySQLdb(或oursql)和pyodbc都有相同的接口(@98​​7654321@),只是如果你使用前者你不必处理ODBC的问题。我强烈建议您考虑改用 MySQLdb(或 oursql)。

【讨论】:

MySQLdb 不能安装在 Windows 上。作者几乎接受它在 Windows 上损坏/不受支持。 我确实提到了另一个选项。 另外,这个:***.com/questions/645943/mysql-for-python-in-windows【参考方案3】:

首先,根据official docs,如果想在不创建DSN的情况下进行连接,需要在连接字符串中指定OPTION=3:

ConnectionString = "DRIVER=MySQL ODBC 3.51 Driver;SERVER=localhost;DATABASE=test;USER=venu;PASSWORD=venu;OPTION=3;"

如果这不起作用,我会通过创建 DSN 来进一步排除故障。

第二,没有 Python 不应该默默地失败。如果在您运行脚本时出现这种情况,那么还有其他问题。

【讨论】:

出于某种奇怪的原因,我现在在控制台上获取堆栈跟踪。脚本仍然无法使用您建议的 [modified] 连接字符串。我找到了一个解决方案。我已经在我的 Linux 机器上安装了 MySQLdb,所以我只需将我的 csv 文件复制到我的 Linux 机器上并在我的 Linux 机器上进行数据导入:(【参考方案4】:

你的司机名字对吗?

您可以检查您的驱动程序名称 Windows -> 控制面板 -> 系统和安全 -> 管理工具 -> ODBC 数据源 -> 驱动程序选项卡 然后将河流名称复制到第一个参数中

喜欢

cnxn = pyodbc.connect("DRIVER=MySQL ODBC 5.3 ANSI Driver; SERVER=localhost;DATABASE=books; UID=root; PASSWORD=password;")

我的问题解决了

或者你可能没有安装驱动,步骤很简单。

【讨论】:

是否可以连接到远程服务器而不是本地主机?我使用 SERVER=10.0.1.235 作为远程 mysql 服务器 IP,但它仍然连接到 localhost 10.0.1.249。我不知道为什么。【参考方案5】:

只需要安装mysql-connector-odbc-3.51.28-win32.msi。

和 pyodbc-2.1.7.win32-py2.7.exe。

当然,你已经安装好了 MySQL 和 python 2.7。

示例:

import pyodbc

cndBase = pyodbc.connect("DRIVER=MySQL ODBC 3.51 Driver; SERVER=localhost; PORT=3306;DATABASE=nameDBase; UID=root; PASSWORD=12345;") 
ptdBase = cndBase.cursor()

query_str = 'SELECT* FROM nameTabla;'
rows  = ptdBase.execute(query_str)

for rw in rows:
    print list(rw)`enter code here`

【讨论】:

'dBase' 未定义。你的意思是“ptdBase”吗?【参考方案6】:

我遇到了同样的错误。我用来建立连接的驱动程序似乎不是我系统中安装的驱动程序。 在 Windows 运行中键入 ODBC,然后根据您安装驱动程序的位置选择 ODBC 数据源(32/64)。 从那里单击系统 DSN,然后单击添加。从那里您可以看到系统中安装的 MySQL 驱动程序。在进行连接的代码中使用 ANSI 驱动程序。

【讨论】:

以上是关于pyodbc 和 mySQL的主要内容,如果未能解决你的问题,请参考以下文章

Pyodbc 变量查询

MSSQL django_pyodbc 连接问题

Windows 上的 pyodbc 和 python 3.4

pyodbc 数据库连接和数字格式

Heroku 部署和 pyodbc

无法使用 pyodbc/pymssql 和 Robot Framework 连接到 SQL\Express