2017-02-14 37 views
1

我是Python新手,希望有人能幫助我弄清楚如何使用Python對元組中的每個項目執行SQL查詢。爲元組中的每個項目執行SQL查詢

我有一個SQL Express服務器,它包含一些徽章閱讀器系統的數據庫。我想要做的是將已掃描到的用戶標識拉入特定的閱讀器,然後使用這些標識獲取實際的用戶名。

目前,我能夠運行查詢來拉取用戶ID,並使用一個ID在另一個表上運行查詢。希望能夠做的事情,似乎有一個問題,正在對第一個查詢創建的元組中的每個用戶標識運行第二個查詢。以下是我目前使用的兩個函數的代碼。

def get_id(): 
global cardholder 
global cur 

cur.execute("SELECT user_id FROM db.table WHERE badgereaderid = 'badgereader1'") 

cardholder = [] 
rows = cur.fetchall() 
for row in rows: 
    if row == None: 
     break 
    cardholder.append(row[0]) 

print(cardholder) 

def get_name(): 
global cardholder 
global user 
global cur 

cur.execute("SELECT FirstName, LastName FROM db.table WHERE user_id= '%s'" % cardholder) 

while 1: 
    row = cur.fetchone() 
    if row == None: 
     break 
    user = row[0] + row[1] 
+0

您可以循環'cardholder' ......除了以上:您正在使用連接到SQL Server Express模塊​​是什麼? – bernie

+0

我正在使用pyodbc – mtnbiker1185

+1

好的,在這種情況下,使用'?'而不是'%s'並將值作爲第二個參數(並確保它是可迭代的)傳遞給'.execute()'... – bernie

回答

1

兩個可能的選項

在Python

for user_id in cardholder: 
    cur.execute("SELECT FirstName, LastName FROM db.table WHERE user_id= '%s'" % user_id) 

但是,爲什麼不只是拉在第一個查詢中的所有數據

反覆查詢?

cur.execute("SELECT a.user_id, b.FirstName, b.LastName FROM db.table1 a left join bd.table2 b on a.user_id = b.user_id WHERE a.badgereaderid = 'badgereader1'") 

,或者使用三引號允許多行字符串,使SQL命令更容易理解

cur.execute("""SELECT 
a.user_id, 
b.FirstName, 
b.LastName 
FROM db.table1 a 
left join db.table2 b 
on a.user_id = b.user_id 
WHERE a.badgereaderid = 'badgereader1'""") 
+0

我應該更多明確。第一個查詢位於一個數據庫中的一個表上,第二個查詢位於不同數據庫中的另一個表上。 – mtnbiker1185

+0

沒關係,我看到你在說什麼並且工作。謝謝。 – mtnbiker1185

1

Python中的好的做法是,如果你打算定義功能之外的數據收集稍後使用它們在你的代碼 試試這個代碼:

cardholder_names = [] 
#pass the cardholder as a param to the function 
def get_name(cardholder): 
#cur is already defined as a global param, no need to do it twice  
    cur.execute("SELECT FirstName, LastName FROM db.table WHERE user_id='{0}'".format(cardholder)) 
    return cur.fetchone() 


#now use the for loop to iterate over all the cardholders 
for holder in cardholders: 
    cardholder_name = get_name(holder) 
    cardholder_names.append({"name" : cardholder_name[0], "surname" : cardholder_name[1]})