ログを眺めていたらSAWarningってメッセージが頻繁に出ていて何かと思ったら
SQLAlchemyのメッセージでした。ちなみにSQLAlchemyはPythonで利用できるO/Rマッパーです。
メッセージを読むと配列が空だよとのことなので原因はわかりました。
site-packages/sqlalchemy/sql/expression.py:1794: SAWarning: The IN-predicate on "users.id" was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate. Consider alternative strategies for improved performance. return self._in_impl(operators.in_op, operators.notin_op, other)
例外は吐かずにパフォーマンスを気にしてるのがちょっと不思議な感じ。
試しにどんなSQL文が出力されているか見てみます。
■usersテーブル
(id, name, age)
■空ではない配列
arr = [10, 20, 5] tmp = User.query.filter(User.id.in_(arr)).all()
生成されたSQL文
SELECT users.id AS users_id, users.name AS users_name, users.age AS users_age FROM users WHERE users.id IN (10, 20, 5)
■空の配列
arr = [] tmp = User.query.filter(User.id.in_(arr)).all()
生成されたSQL文
SELECT users.id AS users_id, users.name AS users_name, users.age AS users_age FROM users WHERE users.id != users.id
空の配列で生成されたSQLは条件に否定演算子が使われていますね。
これは遅くなりそうです。
空の配列がきた場合に、正常な戻り値を目指して、この方法をとったんでしょうね。
なのでin句に配列を渡す場合にはemptyチェックをお勧めします。
バージョン
SQLAlchemy==0.7.2