2017-08-08 58 views
1

如何處理查詢結果,我試圖建立與某列的結果列表。我執行查詢,結果是好的,但在使用我的輸入列表中的數據「list.append」他們只返回「[]」。從cx_Oracle

import cx_Oracle 
con = cx_Oracle.connect('user/[email protected]') 

cur = con.cursor() 
list = [] 

cur.execute('select column from table') 
for result in cur.fetchall(): 
    list.append 
    print (list) 

cur.close() 
con.close() 

返回:

[] 
[] 
[] 

當我把結果以列表,並返回一個指數,類似的結果[0]他們只是打印結果一樣的第一個字母:

E 
X 
A 
M 
P 
L 
E 

當我只是期待:

Example 

我的代碼有問題嗎?最好的問候,社區!

回答

3

有你的代碼了幾個不同的問題。

1)

list.append 

附加什麼? append是列表對象的一種方法,您需要使用參數來調用它。在你的情況,

list.append(result) 

會做你所期望的 - 它追加result到名爲list列表。

注意:這不會產生錯誤的原因是,你甚至不呼叫append功能,你只是引用它。 而在Python中,指令只是表達式是合法的 - 表達式的結果會在作爲腳本運行時被默默丟棄(與交互式解釋器相反,表達式的結果將自動爲您打印) 。

因此,例如,在腳本中的一行有42 == 7是完全合法的。它不會做任何事情(表達式的結果,False,將被默默丟棄),但它也不會導致錯誤。

2)

print (list) 

你在循環中這樣做,這會爲每一次迭代循環一次執行的意思 - 在你的榜樣3倍,因爲很明顯select column from table給出三個結果。上面的數字1)是爲什麼你會得到一個空列表([]),這就是爲什麼你得到空列表三次([] [] [])。

您可能需要將此移到之外,方法是減少它的縮進(向左移動4個空格) - 然後列表內容將只在循環結束時打印一次。

3)

當我把結果以列表,並返回一個索引,就像results[0]他們只是打印結果一樣的第一個字母[...]

我不完全明白你究竟是什麼意思,但:

在Python中,字符串,就像列表一樣,也是序列(as特林是一系列字符)。這意味着可以在兩者上執行一些操作,如索引(sequence[index]語法)或循環它們(for item in sequence)。現在

,如果你得到像

E 
X 
A 
M 
P 
L 
E 
在Python

的結果,這意味着你處理一個對象,它確實是一個在暗示你假設它是一個列表的方式(或其他種類的序列)。例如,如果

for item in results: 
    print(item) 

for i in range(len(results)): 
    print(results[0]) 

導致這種行爲,那麼results實際上是一個字符串,而不是你所期望的列表。


所以總結一下,你可能想是這樣的:

# ... 

results = [] 

cur.execute('select column from table') 
for row in cur.fetchall(): 
    results.append(row) 

# print the entire list 
print(results) 

# print the first row by addressing it via index 
print(results[0]) 

# print the first column of the third row 
print(results[2][0]) 

# ... 

不過請注意,光標結果始終將數據庫行 - 即使你只是選擇一列。

+0

對不起,我發佈了一些錯誤的代碼,但我認爲你明白瞭解。我試圖用列和行列來訪問,我認爲這樣更舒適。我遵循你的例子繼續我的測試,他們工作得很好。非常感謝Lukas!祝你今天愉快。 – Joji

+0

很高興我能有所幫助,並感謝您的反饋。祝你有美好的一天:-) –

1

如果您嘗試從像DB可視化什麼是您的結果看上去像一些工具SQL SELECT語句?這隻會證實你的sql語句沒有問題。

在一個項目中我使用cx_Oracle對我有用於查詢該如下圖所示我的Oracle數據庫的功能。您可以將sql語句作爲sql傳遞給函數。

def execute_query_result_set(sql, args=(), one=False): 
    print "execute_query_result_set()" 
    con = "" 
    con = cx_Oracle.connect(_connection_string) 

    try: 
     cursor = con.cursor() 
     cursor.execute(sql) 
     results = cursor.fetchall() 
     return results 
    finally: 
     if con != "": 
      con.close() 

該函數返回查詢結果列表。如果您選擇的不僅僅是一列多個它將返回元組[(「值」,「其他」)的列表,(「另一個」,「行」),(「一些」,「多」),(」等」,‘等’)]

如果不希望有一個單獨的函數調用,您可以簡單地只是做

con = cx_Oracle.connect(your_db_connection_string) 
cursor = con.cursor() 
cursor.execute(your_sql_select_statement) 
results = cursor.fetchall() 
con.close() 

那麼不同的結果應該是你的結果列表,然後你可以做任何你需要的清單。希望這將有助於

+0

我做了一些測試,函數返回正確的列表爲turples,但不是我想要的,我想把這些結果放在一個列表中以訪問它們的索引。 – Joji

+0

所以你應該仍然可以做到這一點,但只要用結果[x] [y]來訪問,其中x和y是整數,x將是數據庫行,那麼y就是行中的列。我在整個項目中都使用這種方法。你應該仍然可以完全訪問它們 – stephen

+0

但是,它只是一列,這個規則適用? – Joji