使用Python MySQLdb进行`IN`查询的更好方法

时间:2012-12-05 03:33:27

标签: python

当我想用IN进行MySQLdb查询时,我写了类似

的内容
ids = [1,2,3,4,5] # in most cases, this is passed in as a parameter
placeholder = ",".join(["%s"] % len(ids))
cursor.execute("SELECT * FROM a_table WHERE id IN (%s)" % placeholders,
               ids)

到处重复这一点非常麻烦。

我已阅读MySQLdb的手册,但未发现任何相关内容。

所以我想知道其他人怎么做到这一点? MySQLdb是否提供了一种没有记录的更好的方法?

2 个答案:

答案 0 :(得分:0)

如果您愿意尝试SQLAlchemy(我对Flask-SQLAlchemy更熟悉,那么您可能需要稍微更改一下代码),您可以将查询简化为以下内容:

class a_table(db.Model):
    __tablename__ = 'a_table'
    __table_args__ = {
        'autoload': True,
        'autoload_with': db.engine
    }

ids = [1,2,3,4,5]
results = a_table.query.filter(a_table.id.in_(ids)).all()

答案 1 :(得分:0)

您的上述方法似乎是最好的方法,因为您知道,参数化值会转换为文字。如果你多次这样做,我唯一的(不起眼的)建议就是在转换过程中创建一个函数。不理想,但没有绕过MySQLdb提供的内置清理,我似乎无法找到另一种方法来接近它(不是说没有一个)。另外,你可能已经想到了这一点:)

def InQuery(query, vals):
  # Would likely have to be adjusted to handle more complex/compound cases
  return query % ', '.join(['%s'] * len(vals))

然后执行以下查询:

ids = [1,2,3,4,5]
cursor.execute(InQuery(query, ids), ids)