我正在将使用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时,我是否忘记了一些东西?如何使我的代码重新工作?
答案 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不需要它,无论如何,我在编写此问题时发现并决定共享该解决方案。