2014-04-07 6 views
8

निम्नलिखित तर्क mysqldb मॉड्यूल (python mysqldb multiple cursors for one connection देखें) के साथ काम करता है, लेकिन मैं (SQL)पायथन MySQL कनेक्टर कर्सर लूप के भीतर दूसरे एसक्यूएल कथन निष्पादित करता है?

cursor2.execute पर mysql.connector साथ निम्न त्रुटि हो रही है "अपठित परिणाम नहीं मिला।"

मुझे एहसास है कि मैं इन 2 साधारण एसक्यूएल स्टेटमेंट्स को गठबंधन करने के लिए एक दूसरे का उपयोग कर सकता हूं और दूसरे कर्सर की आवश्यकता से बच सकता हूं, लेकिन मेरा असली दुनिया उदाहरण अधिक जटिल है और उसे दूसरा एसक्यूएल स्टेटमेंट चाहिए।

मान लीजिए कि मुझे 2 अलग एसक्यूएल स्टेटमेंट्स (लूप के लिए 1 और लूप के अंदर 1) निष्पादित करने की आवश्यकता है, यह mysql.connector मॉड्यूल के साथ कैसे किया जाना चाहिए?

import datetime 
import mysql.connector 

db = mysql.connector.connect(user='alan', password='please', host='machine1', database='mydb') 

cursor1 = db.cursor() 
cursor2 = db.cursor() 

sql = """ 
SELECT userid, 
     username, 
     date 
    FROM user 
WHERE date BETWEEN %s AND %s 
""" 

start_date = datetime.date(1999, 1, 1) 
end_date = datetime.date(2014, 12, 31) 

cursor1.execute(sql, (start_date, end_date)) 

for (userid, username, date) in cursor1: 

    sql = """ 
     select count(*) 
     from request 
     where assigned = '%s' 
    """ % (userid) 

    cursor2.execute(sql) 
    requestcount = cursor2.fetchone()[0] 

    print userid, requestcount 

cursor2.close() 
cursor1.close() 
db.close() 

यह mysqldb संस्करण बस ठीक काम करता है:

import datetime 
import MySQLdb 

db = MySQLdb.connect(user='alan', passwd='please', host='machine1', db='mydb') 

cursor1 = db.cursor() 
cursor2 = db.cursor() 

sql = """ 
SELECT userid, 
     username, 
     date 
    FROM user 
WHERE date BETWEEN %s AND %s 
""" 

start_date = datetime.date(1999, 1, 1) 
end_date = datetime.date(2014, 12, 31) 

cursor1.execute(sql, (start_date, end_date)) 

for (userid, username, date) in cursor1: 

    sql = """ 
     select count(*) 
     from request 
     where assigned = '%s' 
    """ % (userid) 

    cursor2.execute(sql) 
    requestcount = cursor2.fetchone()[0] 

    print userid, requestcount 

cursor2.close() 
cursor1.close() 
db.close() 

उत्तर

10

MySQL कनेक्टर/अजगर डिफ़ॉल्ट, गैर बफरिंग से, है। इसका अर्थ है कि डेटा स्वचालित रूप से नहीं लाया जाता है और आपको सभी पंक्तियों का उपभोग करने की आवश्यकता है। (यह MySQLdb के साथ काम करता है क्योंकि वह ड्राइवर डिफ़ॉल्ट रूप से बफरिंग कर रहा है।)

कनेक्टर/पायथन का उपयोग करके आपको कर्सर के लिए True पर buffered-argument सेट का उपयोग करना होगा, जिसे आप इटरेटर के रूप में उपयोग करते हैं। ओपी के सवाल में, यह cursor1 होगा:

cursor1 = db.cursor(buffered=True) 
cursor2 = db.cursor() 

तुम भी कनेक्शन तर्क के रूप में उपयोग कर सकते हैं buffered=True सब कर्सर बफरिंग इस संबंध बफरिंग द्वारा instantiated बनाने के लिए।

+0

धन्यवाद गीर्ट! डिफ़ॉल्ट रूप से buffered और non-buffered के बीच व्यापार-बंद निर्णय क्या है? एक उपयोगकर्ता परिप्रेक्ष्य से, यह mysqldb नकल करने के लिए अच्छा लगता है? – panofish

+0

आईएमएचओ, बहुत सारे डेटा लाने पर डिफ़ॉल्ट रूप से नहीं-बफरिंग सुरक्षित है। जब मुझे पता चलेगा कि केवल छोटे परिणाम होंगे, मैं बफरिंग चालू करता हूं। यह कनेक्टर/पायथन में नहीं बदलेगा। – geertjanvdk

+0

फिर से धन्यवाद गीर्ट! बस समझना चाहता था। :) – panofish

संबंधित मुद्दे