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が提供する組み込みのサニタイズをバイパスする以外に、それにアプローチする別の方法を見つけることができないようです(ただし、1つがないことは言うまでもありません)。さらに、あなたはおそらくこれをすでに考えているでしょう:)

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 に答える