2017-02-14 3 views
1

Ich bin neu in Python und hoffe, dass jemand mir helfen kann herauszufinden, wie man eine SQL-Abfrage für jedes Element in einem Tupel mit Python durchführen.Durchführen einer SQL-Abfrage für jedes Element in einem Tupel

Ich habe einen SQL Express-Server, der eine Reihe von Datenbanken für ein Badge-Reader-System enthält. Was ich versuche, ist, die Benutzer-IDs, die gescannt haben, in einen bestimmten Leser zu ziehen und dann diese IDs zu verwenden, um die tatsächlichen Benutzernamen zu erhalten.

Momentan kann ich die Abfrage ausführen, die die Benutzer-ID abruft und eine Abfrage für die andere Tabelle mit nur einer ID ausführt. Was in der Lage sein soll, ein Problem zu lösen, scheint die zweite Abfrage für jede Benutzer-ID in dem Tupel auszuführen, das bei der ersten Abfrage erstellt wurde. Unten ist der Code für die zwei Funktionen, die ich gerade benutze.

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

können Sie Schleife über 'cardholder' ... Abgesehen: welche Modul verwenden Sie SQL Server Express zu verbinden? – bernie

+0

Ich benutze pyodbc – mtnbiker1185

+1

Ok in diesem Fall verwenden Sie '?' Anstelle von '% s' und übergeben Sie Werte als zweites Argument (und stellen Sie sicher, dass es iterierbar ist) zu' .execute() '... – bernie

Antwort

1

zwei mögliche Optionen

Wiederholte Anfragen in Python

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

Aber warum nicht nur in der ersten Abfrage alle Daten ziehen?

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'") 

oder verwenden Sie dreifache Anführungszeichen mehrzeiligen Strings zu ermöglichen und den SQL-Befehl erleichtern

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

Ich hätte mehr sein sollen klar. Die erste Abfrage befindet sich in einer Tabelle in einer Datenbank, die zweite Abfrage in einer anderen Tabelle in einer anderen Datenbank. – mtnbiker1185

+0

Vergiss es, ich sehe was du sagst und das hat funktioniert. Vielen Dank. – mtnbiker1185

1

Eine gute Praxis in Python zu verstehen, ist es, die Datensammlungen außerhalb der Funktion zu definieren, wenn Sie beabsichtigen, sie später in Ihrem Code verwenden diesen Code Versuchen:

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]}) 
Verwandte Themen