首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pyodbc和Server的SQL运算符

使用pyodbc和Server的SQL运算符
EN

Stack Overflow用户
提问于 2011-01-27 16:57:16
回答 4查看 16.9K关注 0票数 14

我使用pyodbc查询Server数据库

代码语言:javascript
复制
import datetime
import pyodbc    
conn = pyodbc.connect("Driver={SQL Server};Server='dbserver',Database='db',
                       TrustedConnection=Yes")
cursor = conn.cursor()
ratings = ("PG-13", "PG", "G")
st_dt = datetime(2010, 1, 1)
end_dt = datetime(2010, 12, 31)
cursor.execute("""Select title, director, producer From movies 
                Where rating In ? And release_dt Between ? And ?""", 
                ratings, str(st_dt), str(end_dt))

但正在收到下面的错误。元组参数需要以不同的方式处理吗?有更好的方法来构造这个查询吗?

代码语言:javascript
复制
('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Line 9: 
  Incorrect syntax near '@P1'. (170) (SQLExecDirectW); 
  [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]
  Statement(s) could not be prepared. (8180)")

更新:

我能够使用string格式化操作符来实现这个查询,这并不理想,因为它引入了安全性问题。

代码语言:javascript
复制
import datetime
import pyodbc    
conn = pyodbc.connect("Driver={SQL Server};Server='dbserver',Database='db',
                       TrustedConnection=Yes")
cursor = conn.cursor()
ratings = ("PG-13", "PG", "G")
st_dt = datetime(2010, 1, 1)
end_dt = datetime(2010, 12, 31)
cursor.execute("""Select title, director, producer From movies 
                Where rating In %s And release_dt Between '%s' And '%s'""" % 
                (ratings, st_dt, end_dt))
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-28 03:37:29

不能使用单个字符串参数将IN ()子句中的多个值参数化。要做到这一点,唯一的办法是:

  1. 字符串替换(正如您所做的那样)。
  2. 在表单IN (?, ?, . . ., ?)中构建一个参数化查询,然后为每个位置持有者传递一个单独的参数。我不是Python to ODBC的专家,但我认为在Python这样的语言中这样做特别容易。这更安全,因为您获得了parameterization.

的全部值

票数 20
EN

Stack Overflow用户

发布于 2013-05-24 10:07:16

为了扩展Larry的第二个选项-动态创建参数化字符串,我成功地使用了以下内容:

代码语言:javascript
复制
placeholders = ",".join("?" * len(code_list))
sql = "delete from dbo.Results where RESULT_ID = ? AND CODE IN (%s)" % placeholders
params = [result_id]
params.extend(code_list)
cursor.execute(sql, params)

给出具有适当参数的以下SQL:

代码语言:javascript
复制
delete from dbo.Results where RESULT_ID = ? AND CODE IN (?,?,?)
票数 23
EN

Stack Overflow用户

发布于 2019-09-19 14:34:54

为了进一步了解拉里和地理学家的答案:

代码语言:javascript
复制
ratings = ('PG-13', 'PG', 'G')
st_dt = datetime(2010, 1, 1)
end_dt = datetime(2010, 12, 31)

placeholders = ', '.join('?' * len(ratings))
vars = (*ratings, st_dt, end_dt)
query = '''
    select title, director, producer
    from movies
    where rating in (%s)
       and release_dt between ? and ?
''' % placeholders

cursor.execute(query, vars)

对于占位符,这将返回以下查询:

代码语言:javascript
复制
    select title, director, producer
    from movies
    where rating in (?, ?, ?)
       and release_dt between ? and ?

如果您传入ratings,它将尝试将其所有项都放入一个?中。但是,如果我们传入*ratings,而ratings中的每一项都将在in()子句中取代它的位置。因此,我们将元组(*ratings, st_dt, end_dt)传递给cursor.execute()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4819356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档