2017-06-10 19 views
0

只使用sqlite3.connect的遊標實例我想知道它(遊標實例)是否有執行查詢與否。Python,Sqlite的 - 有沒有什麼辦法來區分查詢的空結果,而不是首先執行

def f(cur): 
    cur = connection.cursor() 
    if user decided to: 
     cur.execute("select * from aTable Where aCondition") 
    return cur 
... 

if f(cur).fetchone() == None: 
    print("No record found") 
else: 
    ...print records... 

我的問題是,只使用返回cur,我不知道如何在用戶決定不訂購查詢,只是取消的情況區分(在返回的地方) 結果設置的情況下的搜索正好是

在我目前的代碼中,在這兩種情況下都會顯示「No record found」消息。是否有任何技巧(例如通過sqlite)指定任何查詢剛剛被執行而不管結果如何?

編輯:

請原諒我無法解釋我的情況,因爲它是在第一個地方(我在該領域缺乏經驗)

的消音我已經是一個設計如下。我不想在實例化時使用另一個全局變量或更改childWin類來接收另一個參數。通過這種方式,兩個窗口之間交互的唯一渠道似乎是cur對象(在cw實例減少後生存)。所以我該怎麼做?

class mainWin(): 
    self.cw=childWin() 
    self.cur=self.cw.cur 
    self.wait_window(self.cw) 
    if self.cur==None: 
     **whether search has been canceled (by hitting cancel button) or result is empty?** 
    else: 
     use the returned records 

class childWin(tkinter.Toplevel): 
    def __init__(self): 
     global con 
     self.cur=con.connection.cursor() 

    def cancel_button: 
     self.destroy() 

    def search_button(): 
     self.cur.execute("select * from aTable Where aCondition") 
     self.destroy() 
+0

什麼是'用戶決定'?這是無效的對象名稱 –

+0

我已經添加了直接的答案,但也許你可以在'mainWin'上創建'self.result = [None]',然後將它傳遞給'self.cw = childWin(self.result)',然後將'None'(空結果)或結果追加到'search_button()'中?這樣,如果用戶取消了,'self.result'列表將是'[None]',如果是空的結果,則''None,None]'和'[None,[..records ..]]'結果。絕對是hacky,但你似乎在這個領域:-)(這是一個消息隊列概念的嚴重簡化...) – thebjorn

回答

0

如果你確定自己的方式來破解到終點,那麼也許cur.description屬性將幫助您:

>>> import sqlite3 
>>> sqlite3.connect('foo.db') 
<sqlite3.Connection object at 0x0075B410> 
>>> cn = _ 
>>> c = cn.cursor() 
>>> print c.description 
None 
>>> c.execute('create table foo (n int)') 
<sqlite3.Cursor object at 0x02B6CC60> 
>>> print c.description 
None 
>>> c.execute('select * from foo') 
<sqlite3.Cursor object at 0x02B6CC60> 
>>> print c.description 
(('n', None, None, None, None, None, None),) 
>>> 

cursor.description會後選擇一個元組。

我沒有用過這個東西,所以「買家應該是潔具」,「這裏是龍」等,等等。

+0

你是真正的專業人士,看起來正是我所需要的。稅收 – Ali

+0

這可能是你想要的,但我懷疑這是你所需要的;-)無論如何,與你的最後期限祝你好運。 – thebjorn

0

要捕捉特殊事件(如用戶取消搜索),您可以使用異常:

def do_search(cur): 
    cur=connection.cursor() 
    if user cancels: 
     raise RuntimeError("canceled") 
    cur.execute("select * from aTable Where aCondition") 
    return cur 

try: 
    results = do_search(cur) 
except RuntimeError: 
    print "User canceled" 
else: 
    results = list(results) 
    if not results: 
     print("No record found") 
    else: 
     ...print records... 

您的編輯:不要混淆GUI和邏輯。窗戶應該收集用戶輸入,但搜索應該在其他地方完成。使用額外的標誌取消:

def do_search(condition): 
    ... somehow construct select from condition ... 
    return records 

class mainWin(): 
    def start_search(self): 
     search_window = SearchWindow() 
     self.wait_window(search_window) 
     if search_window.canceled: 
      ... canceled ... 
     else: 
      records = do_search(search_window.condition) 
      ... use the returned records ... 

class SearchWindow(tkinter.Toplevel): 
    def __init__(self): 
     self.canceled = True 

    def cancel_button(self): 
     self.canceled = True 
     self.destroy() 

    def search_button(self): 
     self.canceled = False 
     self.condition = "aCondition" 
     self.destroy() 
+0

我學到了一個非常有用的技術,Tnx。不幸的是,它不能適用於我的情況。 – Ali

1

這是一個不匹配的抽象層次的情況。

您正在混合(a)用戶操作與(b)基本數據庫操作。

用戶動作應該是在更高層次上比基本的數據庫操作:

def user_interaction(): 
    ... 
    if user decided to: 
     cur = run_query() 
     ... 

def run_query(): 
    cur = connection.cursor() 
    cur.execute("select * from aTable Where aCondition") 
    return cur # open resultset.. 

當編寫低級別的數據庫功能,它通常是一個好主意,不留光標用,因爲(我)待處理結果開有一個(ii)您可以阻止可能導致死鎖的其他進程。寫你的數據庫層,以便它返回正是你所需要的數據,例如:

def get_foo_record(): 
    cur = connection.cursor() 
    cur.execute("select * from aTable Where aCondition limit 1") 
    return cur.fetchone() 

def user_interaction(): 
    ... 
    if user decided to: 
     record = get_foo_record() 
     if record is None: 
      print("No record found") 
     else: 
      ...do something with record... 

即您通過分離從底層代碼的用戶交互關注區分並不然VS空的結果,使低級別(數據庫)代碼儘可能簡單和確定性。

+0

你一定是對的,我犯了一個設計錯誤。但它的一部分,我和時間賽跑。目前我的問題有沒有辦法解決? – Ali

相關問題