使用pyodbc和python3

时间:2018-07-26 10:55:43

标签: python-3.x encoding out-of-memory sybase pyodbc

环境

  • Python:3.4.2
  • pyodbc:4.0.23
  • 操作系统:Debian 9
  • 数据库:Sybase 12.5.3
  • 驱动程序:unixODBC 2.3.1

问题

我正在将使用Django和SQLAlchemy的Web应用程序从Python2移植到Python3,并且一切正常,除了对任何表执行“ SELECT *”的查询。我用以下代码对其进行了测试:

connector = "DRIVER={%s};Server=%s;Database=%s;UID=%s;PWD=%s;TDS_Version=%s;Port=%s;" % my_db
conn = db.connect(connector)
cur = conn.cursor()
query = 'SELECT * FROM My_Table'
cur.execute(query)
row = cur.fetchall()

预期的行为,该表包含表中每行的元组和所有可用列。但是,相反,我从python中获得了“ DEAD”标志,并在syslog中添加了以下行:

Jul 25 09:26:27 my_machine kernel: [8628886.255305] Out of memory: Kill process 25238 (python) score 909 or sacrifice child.

相同的代码在Python2中也可以正常工作。我决定尝试查询较少的字段。仅要求2个字段(ID,昵称),代码在Python3中就可以正常工作,因此尝试了一下,发现当我的查询返回一个包含特殊字符(例如ç,ã等)的字段时,以下内容错误发生:

"pyodbc.ProgrammingError: ('42000', "[42000] [FreeTDS][SQL Server]Some character(s) could not be converted into client's character set.  Unconverted bytes were changed to question marks ('?') (2403) (SQLGetData)")"

在使用Python3时,我是否忘记了一些东西?如何使我的代码重新工作?

1 个答案:

答案 0 :(得分:1)

要使用Python3,我必须这样做:

$title = stopWords($title);

$query->where(function($q) use($title) {
    for ($i = 0; $i < count($title); $i++) 
    {
        if ( count($title) > 1 && $i == 0 )
            continue;

        if ( count($title) > 1 ) 
        {
            $q->orWhere('title', 'like', '%' . $title[$i - 1] . ' ' . $title[$i] . '%');
            $q->orWhere('description', 'LIKE', '%' . $title[$i - 1] .' '.$title[$i]. '%');
        } 
        else {
            $q->orWhere('title', 'like', '%' . $title[$i] . '%');
            $q->orWhere('description', 'LIKE', '%' . $title[$i] . '%');
        }
    }
});

当我告知编码时,我的代码可用于Python3。出于某种原因,Python2不需要它,无论如何,我在编写此问题时发现并决定共享该解决方案。