对元组中的每个项执行SQL查询

时间:2017-02-14 16:59:47

标签: python sql-server

我是Python的新手,我希望有人可以帮我弄清楚如何使用Python对元组中的每个项目执行SQL查询。

我有一个SQL Express服务器,其中包含许多用于徽章阅读器系统的数据库。我想要做的是将已扫描的用户ID拉入特定的阅读器,然后使用这些ID来获取实际的用户名。

目前,我可以运行提取用户ID的查询,并使用一个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]

2 个答案:

答案 0 :(得分: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'""")

答案 1 :(得分: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]})