0

当我想用 做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 是否提供了一种未记录的更好方法?

4

2 回答 2

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()
于 2012-12-05T03:54:04.610 回答
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)
于 2012-12-05T03:57:35.600 回答