8

SqlAlchemy Coreを使用して、データがテーブルに存在するかどうかを確認する必要があるという問題に直面しました。

existsこのクエリを実行する最良の方法は、最初のアイテムが見つかるとすぐに検索を停止するメソッドを使用することだと思います。そこで、このバージョンのクエリを作成しました。

conn = self.db.connect()
query = exists().where(cookie_table.c.cookie_id == cookie_id)
result = conn.execute(query)

ただし、次のエラーが発生します。

StatementError: Not an executable clause (original cause: ArgumentError: Not an
executable clause) 'EXISTS (SELECT * \nFROM cookie \nWHERE cookie.cookie_id = ?)' []

私はそれを少し変更しようとしましたが(selectと組み合わせて)、役に立ちませんでした。

それで、最終的に私は、を使用して、機能する別の解決策を思いつきましたlimit(1)

conn = self.db.connect()
query = select([1], cookie_table.c.cookie_id == cookie_id).limit(1)
result = conn.execute(query).fetchone()
return True if result is not None else False

2つの質問があります:

方法でタスクをどのように達成できますexistsか?

クエリはとlimit同じくらい効率的existsですか?

4

1 に答える 1

10

documentationによるとexists、オブジェクトに適用されSelect、次の例が提供されています。

# use on an existing select()
s = select([table.c.col1]).where(table.c.col2==5)
s = exists(s)

# construct a select() at once
exists(['*'], **select_arguments).where(criterion)

# columns argument is optional, generates "EXISTS (SELECT *)"
# by default.
exists().where(table.c.col2==5)

では、コードの何が問題になっているのでしょうか?

私の理解でEXISTSは、それ自体はディレクティブではないため、 anを実行exists()しようとすると、実行可能な句ではないため失敗します。

説明のために、単純な sqlite コンソールで試すことができます。

  • EXISTS(SELECT * from t);エラーです
  • SELECT EXISTS(SELECT * FROM t);期待どおりに 0 または 1 が返されます。

問題を解決するにはどうすればよいですか?

実行可能なステートメントexists()でラップします。select()

result = conn.execute(select([exists().where(cookie_table.c.cookie_id == cookie_id)]))

期待どおりに動作するはずです:

>>> print select([exists().where(users.c.name=='test')])
SELECT EXISTS (SELECT *
FROM users
WHERE users.name = :name_1)

さて、あなたは or を使うべきですexistslimit?率直に言って、私にはわかりません。答えがデータベースエンジンに依存していないかどうかさえわかりません...

于 2013-03-13T10:53:15.667 に答える