SQLAlchemyのSAWarningメッセージ

ログを眺めていたら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