准备好的sql语句

时间:2016-01-28 12:38:28

标签: python sql pyodbc sqlanywhere

我的问题与Python list of String to SQL IN parameter有些相同,但我有一个整数列表。我使用的python代码是:

ids = [1000032, 1000048]
sql = 'SELECT CompNo, CompName, CompType FROM Component WHERE DeptID IN (?)'    
cursor.execute(sql, [','.join(ids)])

Sybase数据库引擎响应:

pyodbc.Error: ('07006', "[07006] [Sybase][ODBC Driver][SQL Anywhere]Cannot convert '1000032','1000048' to a numeric (-157) (SQLExecDirectW)")

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

IMO是一种使用str.format

构建带占位符的动态查询字符串的更具可读性的方法
ids = [1000032, 1000048]
sql = 'SELECT CompNo, CompName, CompType FROM Component WHERE DeptID IN ({0})' 
sql = sql.format(','.join('?' * len(ids)))
cursor.execute(sql, (ids,))
...

答案 1 :(得分:3)

您不能将IN列表作为一个参数提供。您需要在SQL IN子句中提供确切的占位符数,然后将该数组提供给 execute 方法:

ids = [1000032, 1000048]
sql = 'SELECT CompNo, CompName, CompType FROM Component WHERE DeptID IN (' \
       + (',?' * len(ids))[1:] + ')'
cursor.execute(sql, ids)

答案 2 :(得分:0)

你应该将int数组转换为字符串数组:

",".join(map(str,ids))