2017-06-02 21 views
0

私はmysql SQLを呼び出すpythonスクリプトを作成しようとしています。ループでSQLを実行するPythonスクリプト

2番目のクエリを実行するために、最初のクエリ結果に依存しています。問題は、それがエラーを投げているということです。

エラー:それは例えば、dictsのリストを返しますので、cursor2.execute(field_sql、ID)

import boto3 
import importlib 
import psutil 
import pymysql 
import pymysql.cursors 
import subprocess 
import sys 

rdsConn = pymysql.connect(host = 'XXXX'), 
          db = 'XXXX', 
          user = 'XXXX', 
          password = 'XXXX', 
          charset = 'utf8mb4', 
          cursorclass=pymysql.cursors.DictCursor) 

cursor1 = rdsConn.cursor() 
cursor2 = rdsConn.cursor() 


name = 'Test' 
sql = "select id from Table1 where name = %s" 
cursor1.execute(sql,name) 
result = cursor1.fetchall() 
for id in result: 
    field_sql= "select columnname from Table2 where id = %s" 
    cursor2.execute(field_sql,id) 
    fieldresult = cursor2.fetchall() 
    for fieldrow in fieldresult: 
     print(fieldrow) 

cursor1.close() 
cursor2.close() 
rdsConn.close() 
+0

正確にどのようなエラーを隠し?スタックトレースを投稿してください。 – mata

+0

最初のクエリから得た結果を調べてみましたか?それはdictを返すので、あなたのforループはキーを反復処理しますが、その代わりに値を求めたいでしょうか? –

答えて

2

はあなたのクエリは、dictのカーソルを使用しています。

手段
[{'id': 1}, {'id': '2'}, ...] 

id *はdictであり、それ以外の場合はタプルではありません。つまり、あなたは引数を二番目のクエリにdictとして渡しています。その場合、あなたはpyformatスタイルを使用して、名前付きパラメータを使用する必要があります。

for rowdict in result: 
    field_sql = "select columnname from Table2 where id = %(id)s" 
    cursor2.execute(field_sql, rowdict) 
    fieldresult = cursor2.fetchall() 
    for fieldrow in fieldresult: 
     print(fieldrow) 

はあなたが印刷されたfieldrow sがdict秒でもあることがわかります。

また、クエリパラメータはdict(名前付きパラメータ)またはタプル(定位置パラメータ)として渡す必要があります。 pymysqlはフォームcursor.execute(sql, "name")を受け付け、他のdbapi2コネクターは受け付けません。正準形式はcursor.execute(sql, ("name",))です。

*ところで、あなたは名前としてidを使用してはならない、それは組み込みid機能

関連する問題