2017-02-14 4 views
1

Я новичок в Python и надеюсь, что кто-то может помочь мне выяснить, как выполнить SQL-запрос для каждого элемента в кортеже, используя Python.Выполнение SQL-запроса для каждого элемента в кортеже

У меня есть сервер SQL Express, который содержит несколько баз данных для системы чтения значков. То, что я пытаюсь сделать, это вытащить идентификатор пользователя, который был отсканирован в конкретный читатель, а затем использовать эти идентификаторы для получения фактических имен пользователей.

В настоящее время я могу запустить запрос, который вытаскивает идентификатор пользователя и запускает запрос в другой таблице, используя только один идентификатор. То, что вы хотите иметь, и, похоже, обнаруживаете проблему, выполняет этот второй запрос для каждого идентификатора пользователя в кортеже, который создается из первого запроса. Ниже приведен код для двух функций, которые я использую в настоящее время.

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

Nevermind, я вижу, что вы говорите, и это сработало. Спасибо. – 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]}) 
Смежные вопросы