2017-02-14 9 views
1

私はPythonの初心者です。誰かが、Pythonを使用してタプルの各項目に対してSQLクエリーを実行する方法を理解するのを助けてくれることを願っています。タプル内の各項目のSQLクエリーを実行する

私は、バッジリーダーシステムのためのいくつかのデータベースを含むSQL Expressサーバーを持っています。私がやろうとしているのは、特定のリーダーにスキャンしたユーザーIDを取得し、そのIDを使用して実際のユーザー名を取得することです。

現在、ユーザーIDを取得し、1つのIDだけを使用して他のテーブルのクエリを実行するクエリを実行できます。できることをしたいと思っている問題は、最初のクエリから作成されたタプル内のすべてのユーザーIDに対して2番目のクエリを実行しています。以下は私が現在使っている2つの関数のコードです。

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'の代わりに'? 'を使い、2番目の引数として値を渡します(そして、iterableであることを確認してください)。.execute()' ... – bernie

答えて

1

つの可能なオプション

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

しかし、なぜちょうど最初のクエリ内のすべてのデータを引っ張らないPythonの

繰り返しクエリ?

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

または、

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

明らかです。最初のクエリはあるデータベースのテーブルにあり、2番目のクエリは別のデータベースの別のテーブルにあります。 – mtnbiker1185

+0

あなたは何を言っているのか分かりません。ありがとうございました。 – mtnbiker1185

1

Pythonで良い練習はあなたが意図した場合関数の外部データ収集を定義することですが理解しやすい複数行の文字列を許可し、SQLコマンドを作るために、三重引用符を使用このコードを試してみてください あなたのコード内で後でそれらを使用するには:

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]}) 
関連する問題