2013-03-13 25 views
3

我遇到了一個問題,我必須找到表中的數據是否存在使用SqlAlchemy核心SqlAlchemy核心和裸存在查詢

我認爲做這個查詢的最好方法是使用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 = ?)' [] 

我試着修改了一點(與選擇相結合),但無濟於事。

因此,最終我想出了另一種解決方案,使用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 

我有兩個問題:

怎樣的任務可以用exists方法實現?

查詢結果limitexists一樣有效嗎?

回答

6

the documentationexists適用於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本身並不是一個指令,所以試圖執行因爲它不是一個可執行子句的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) 

現在,你應該使用existslimit?坦率地說,我不知道,我甚至不知道答案不取決於您的數據庫引擎...

+0

謝謝!我嘗試了這一點,並引發了以下錯誤:'ArgumentError:select()的列參數必須是Python列表或其他可迭代的' – ovgolovin 2013-03-13 11:05:27

+0

對不起,我忘了括號!編輯我的答案。 – icecrime 2013-03-13 11:32:58

+0

謝謝!它與方括號一起使用。奇怪的是,文件中沒有提到'exists'的用法。我認爲這是很常見的操作,以確定數據庫中是否存在某些東西。 – ovgolovin 2013-03-13 20:21:27