【问题标题】:Python SQL database query giving "Too few parameters" errorPython SQL 数据库查询给出“参数太少”错误
【发布时间】:2015-02-18 18:55:07
【问题描述】:

我有以下代码试图从 Access 数据库中提取几个 SQL 查询

import pyodbc
import datetime

conx = pyodbc.connect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\\Users\\Stuart\\PycharmProjects\\untitled\\Databases\\SandP.accdb;")

cursor=conx.cursor()

query=""" SELECT DISTINCT Date_ FROM Closing_prices
     WHERE Date_ >= ? AND Date_ < ?"""

params1 = (datetime.date(2011, 8, 10), datetime.date(2014, 4, 30))
cursor.execute(query, params1)

dates = list()
for date in cursor:
    dates.append(date[0])

for date in dates:
    params2 = date
    cursor = conx.cursor()

    query= '''SELECT Volatility,Last_price FROM Volatility v,Closing_prices c WHERE c.Date_= ? and v.Date_=c.Date_'''
    cursor.execute(query,params2)

    for (vol,price) in cursor:
        volatility=float(vol)
        closing_price=float(price)
    cursor.close()

    cursor = conx.cursor()
    if (date.weekday()==4):
        nextDay=(date + datetime.timedelta(days=3))
    else:
        nextDay=(date + datetime.timedelta(days=1))

    query= '''SELECT Date_,Time_, Close_ FROM Intraday_values WHERE (date = ? and time >= ?) or (date = ? and time <= ?)'''

    params3 = (date,datetime.time(15, 30),nextDay,datetime.time(15, 14))
    cursor.execute(query,params3)

最后一点抛出以下错误:

Traceback (most recent call last):
File "C:/Users/Stuart/PycharmProjects/untitled/Apache - Copy.py", line 67, in <module>
cursor.execute(query,params3)
pyodbc.Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 6. (-3010) (SQLExecDirectW)')

请求正在尝试从表中提取 Date_、Time_ 和 Close_ 项,因为它遍历先前创建的日期列表,以及“15:30 之后”的截止时间用于“日期”,“15:14 之前”用于“日期+1”。

首先,当 SQL 请求中只有 4 个问号 (?) 时,为什么会有 6 个参数 - 我没有正确形成这个吗?

另外,我在 datetime.time 的参数创建过程中进行了尝试。这也是错误的格式吗?

我有点不知所措!

【问题讨论】:

  • 在您的最后一个(麻烦的)查询中,datetime 是表中实际字段的名称,还是您的 WHERE 子句真的应该引用 Date_Time_? (顺便说一句,您对datetime.time() 的使用应该可以正常工作。)
  • 啊,这是我需要的正确方向的推动,我将其更改为 query= '''SELECT Date_,Time_, Close_ FROM Intraday_values WHERE (Date_ = ? and Time_ >= ?) 或 ( Date_ = ? and Time_
  • 我会在查询字符串中使用str.format(),传递日期和时间值而不是使用游标参数。较少依赖于数据库 (Jet),但更多地依赖于客户端 (Python)。但这只是一种偏好——每个人都有自己的偏好!

标签: python sql ms-access


【解决方案1】:

更改查询后工作 到

query= '''SELECT Date_,Time_, Close_
          FROM Intraday_values
          WHERE (Date_ = ? and Time_ >= ?)
                OR (Date_ = ? and Time_ <= ?)'''

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多