【问题标题】:Pypyodbc.DataError trouble with databasePypyodbc.DataError 与数据库有关的问题
【发布时间】:2015-05-25 17:07:55
【问题描述】:

我试图弄清楚为什么我在 python 中的测试程序不起作用。 我可以从 MySql Workbench 很好地访问数据库,我认为我在编程部分做的一切都正确,我还去了管理工具并将我的数据库添加到 ODBC 数据库源,这是我的测试程序,如果有人能弄清楚是什么错误:

import pypyodbc

conn = pypyodbc.connect("DSN=database")


def func():
    l = []
    cur = conn.cursor()
    try:
        cur.execute("SELECT foo FROM table")
    except pypyodbc.DatabaseError:
        pass
    conn.commit()
    for i in cur:
        l.append(i)
    conn.close()
    cur.close()

func()

我得到的错误是:

Traceback (most recent call last):
  File "D:/path/test.py", line 21, in <module>
    func()
  File "D:/path/test.py", line 14, in func
    for i in cur.fetchall():
  File "D:/path/test.py", line 1819, in fetchall
    row = self.fetchone()
  File "D:/path/test.py", line 1893, in fetchone
    check_success(self, ret)   
  File "D:/path/test.py", line 986, in check_success
    ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
  File "D:/path/test.py", line 956, in ctrl_err
    raise DataError(state,err_text)
pypyodbc.DataError: ('22018', '[22018] [MySQL][ODBC 5.3(a) Driver][mysqld-5.5.5-10.0.17-MariaDB]')

【问题讨论】:

  • 看起来您正在使用 ANSI ("(a)") 版本的 ODBC 驱动程序。尝试使用 Unicode 版本 ("(w)") 看看是否有帮助。此外,在 SELECT 语句之后不需要 .commit()
  • 谢谢它现在可以工作了,这是驱动问题。
  • @Gord 应该在哪里实际使用提交我把它放在那里是因为我在 pypyodbc 示例中看到了它?
  • .commit() 仅在 SQL 语句对数据进行更改(例如,INSERT、UPDATE、DELETE)时才需要。一个简单的 SELECT 语句只检索数据,因此根本不需要 .commit()。

标签: python mysql pypyodbc


【解决方案1】:

错误 22018 是“无效字符”错误。一个常见原因是尝试使用 MySQL Connector/ODBC 的 ANSI ("(a)") 版本来检索 Unicode 数据。在这种情况下,解决方案是改用 Unicode ("(w)") 版本的驱动程序。

【讨论】:

  • 问题出在驱动程序上,我所做的是使用 Unicode 驱动程序,现在它可以正常工作了。感谢您的帮助。
猜你喜欢
  • 2010-09-14
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2020-03-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多