【问题标题】:Executemany on pyodbc only return result from last parameterpyodbc 上的 Executemany 仅返回最后一个参数的结果
【发布时间】:2016-05-02 15:59:53
【问题描述】:

我在尝试使用 pyodbc executemany 函数时遇到问题。 我有一个 Oracle 数据库,我想提取多天的数据。

我不能在我的请求中使用 between,因为数据库没有在日期字段上建立索引并且它永远占用。 我想整天手动询问并处理答案。 我无法线程化这部分,所以我想使用executemany 更快地获取行。

问题是当我使用executemany 时,我只得到了最后一个参数的结果。

这是我的代码:

import pyodbc

conn = pyodbc.connect('DRIVER={Oracle in instantclient_11_2};DBQ=dbname;UID=uid;PWD=pwd')
cursor = conn.cursor()
query = "SELECT date FROM table WHERE date = TO_DATE(?, 'DD/MM/YYYY')"
query_args = (
                 ('29/04/2016',),
                 ('28/04/2016',),
)
cursor.executemany(query, query_args)
rows = cursor.fetchall()

在行中,我只能找到带有(datetime.datetime(2016, 4, 28, 0, 0), ) 的行。 总是最后一个参数。

我在 Oracle 数据库上使用来自 WinPython 的 python 2.7.9,客户端在 11.0.2。 除了这个查询,其他所有查询都很好。

我不能使用IN () synthax 有两个原因:

  • 我想限制数据库端的操作,并在脚本端做大部分事情(我试过但太长了)

  • 我的请求中可能有超过 1000 个不同的日期。

(现在我正在使用 IN() OR IN() OR IN()...但是如果有人找到更好的东西那就太好了!)

我做错了吗?

感谢您的帮助。

【问题讨论】:

    标签: python-2.7 oracle11g pyodbc


    【解决方案1】:

    您的查询使用一个参数运行一次。如果要运行多个日期,请使用“IN”子句,这将需要稍微修改 query_args。

      "SELECT date FROM table WHERE date in (TO_DATE(?, 'DD/MM/YYYY'), TO_DATE(?, 'DD/MM/YYYY'))"
    
     query_args = (
                 ('29/04/2016','28/04/2016'),
     )
    

    或光标通过每个日期参数:

    while query_arg in query_args:
      cursor.executemany(query, query_arg )
      rows = cursor.fetchall()
    

    【讨论】:

    • 确实可以,但正如我所说,我想限制数据库端的操作,因为它在我的数据库上花费了太多时间,我想在脚本端处理事情,这就是我想要的原因使用executemany。您可以使用execute 进行请求,不需要executemany
    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 2021-07-25
    • 2022-01-03
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2018-06-05
    • 2016-08-17
    相关资源
    最近更新 更多