当我想用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是否提供了一种没有记录的更好的方法?
答案 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)