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

参数化'SELECT IN(…)'查询

  •  5
  • MikeyB  · 技术社区  · 14 年前

    我想使用MySQLdb创建一个参数化查询,例如:

    serials = ['0123456', '0123457']
    c.execute('''select * from table where key in %s''', (serials,))
    

    但最终发送给DBMS的是:

    select * from table where key in ("'0123456'", "'0123457'")
    

    是否可以创建这样的参数化查询?或者我必须循环自己并建立一个结果集?

    注意:executemany(…)对此不起作用-它只返回最后一个结果:

    >>> c.executemany('''select * from table where key in (%s)''',
            [ (x,) for x in serials ] )
    2L
    >>> c.fetchall()
    ((1, '0123457', 'faketestdata'),)
    

    最后的解决方案改编自加雷斯的聪明回答:

    # Assume check above for case where len(serials) == 0
    query = '''select * from table where key in ({0})'''.format(
        ','.join(["%s"] * len(serials)))
    c.execute(query, tuple(serials)) # tuple() for case where len == 1
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Gareth Rees    14 年前

    你想要这样的东西,我想:

    query = 'select * from table where key in (%s)' % ','.join('?' * len(serials))
    c.execute(query, serials)