准备好的sql语句中的int的Python列表

Mar*_*nik 4 python sql sqlanywhere pyodbc

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

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

Sybase数据库引擎的响应为:

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

正确的方法是什么?

tri*_*cot 5

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

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


Bry*_*yan 5

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,))
...
Run Code Online (Sandbox Code Playgroud)