代码之家  ›  专栏  ›  技术社区  ›  mmoore

条件中的值列表出现“参数太少”错误

  •  0
  • mmoore  · 技术社区  · 7 年前

    我正在使用pyodbc模块从python查询ms-access数据库。如果查询表中的所有记录,我可以这样做,但是当添加where子句时,我会得到一个错误。

    这是我的代码:

    wpc_ids = ['WPCMOOTEST2', 'WPCMOOTEST1']
    conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=P:\Conservation Programs\Natural Heritage Program\Data Management\ACCESS databases\POND_entry\POND_be.accdb;')
    cursor = conn.cursor()
    wpc_list = ','.join(str(x) for x in wpc_ids)
    cursor.execute('SELECT * FROM pools WHERE wpc_id IN (%s)'%wpc_list)
    

    我得到以下错误:

    Error: ('07002', u'[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2. (-3010) (SQLExecDirectW)')
    

    如果没有where子句,我就不会得到那个错误,所以我不确定我需要的第二个参数是什么。有人能帮忙吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   nosklo    7 年前
    cursor.execute(
        'SELECT * FROM pools WHERE wpc_id IN ({})'.format(
            ','.join('?'*len(wpc_ids))), wpc_ids
    )
    

    说明:

    有一个关于数据库的pep,pep249,你可以在这里阅读 https://www.python.org/dev/peps/pep-0249/

    这个pep定义了数据库模块的api应该如何。 pyodbc 是您正在使用的数据库模块,它与PEP249兼容。

    pep定义的一件事是每个模块都应该有一个 paramstyle 是的。 pyodbc.paramstyle qmark 所以你才会用 '?' 使用pyodbc。更多细节 https://www.python.org/dev/peps/pep-0249/#paramstyle

    现在,与其将查询构建为字符串并将其发送到数据库,不如使用参数传递,这是一种将查询和参数分开发送的方法…它使用 花式 若要在查询中放置占位符,请将一系列参数作为第二个参数传递给 execute 是的。例子:

    sql = 'SELECT * FROM foo WHERE id = ? AND text_col = ?'
    params = (12, 'testing')
    cursor.execute(sql, params)
    

    注意,这不是将参数与字符串混合。代码将它们作为两个独立的参数传递给 .execute() 是的。这意味着数据库的工作是安全地进行插值。

    由于要向查询传递多个值,因此必须生成一个字符串,其中包含用逗号分隔的占位符数,该数字与列表中的元素数相同:

    ','.join('?'*len(wpc_ids)))  
     # will generate ?,?,?,?,? according with length of list