मेरे पास एक पायथन लिपि है जो हमेशा पृष्ठभूमि पर चलती रहती है
नोहप पायथन script.py &
तो क्या स्क्रिप्ट करता है: यह mqtt पर जाँच करता है कि क्या वहाँ कोई संदेश है और यदि सही है तो इसे डेटाबेस पर डालें
on_message(client, userdata, msg):
SQL.execute("INSERT INTO logs(deviceID) VALUES (msg)")
मैं डीबी से कनेक्ट करने के लिए इस तरह का उपयोग करता हूं लेकिन कुछ घंटों के बाद कनेक्शन बंद हो जाता है और स्क्रिप्ट चल रही है लेकिन यह डीबी में डालने में सक्षम नहीं है
mydb = mysql.connector.connect(host="localhost", user="xxxx", passwd="xxxx", database="xxx")
SQL = mydb.cursor()
प्रश्न:
- क्या मुझे हर बार SQL.execute() से पहले नया कनेक्शन खोलने की आवश्यकता है या इसे खुला रखने के लिए बेहतर है?
- क्या आप वह कोड जोड़ सकते हैं जो आपको लगता है कि उपयोग करना बेहतर है
2 जवाब
जब आपको इसकी आवश्यकता हो तो कनेक्शन खोलना सबसे अच्छा है और इसे केवल खुला न छोड़ें क्योंकि इससे संसाधनों का एक टन बर्बाद हो जाएगा।
जब अपवाद 'MySQL सर्वर चला गया' उठाया जाता है, तो आप MySQL डीबी को फिर से कनेक्ट करने के लिए इस तरह के किसी भी डीबी हैंडलर फ़ंक्शन में डेकोरेटर जोड़ सकते हैं। कोड यहां से लिया गया है
class DB:
"""Database interface"""
def retry(func):
def call(self, *args, **kwargs):
lock.acquire()
try:
return func(self, *args, **kwargs)
except MySQLdb.Error, e:
if 'MySQL server has gone away' in str(e):
# reconnect MySQL
self.connect_mysql()
else:
# No need to retry for other reasons
pass
finally:
lock.release()
return call
def __init__(self):
pass
def connect_mysql(self):
# create connection here
@retry
def execute(self):
# use the decorator to get conenction and do you SQL.execute() here
आपके संदेश कितनी बार आते हैं? यदि वे बहुत अधिक बार नहीं आते हैं, तो मैं केवल try
कनेक्शन खोलूंगा, सम्मिलित करूंगा, फिर उसे else
में बंद कर दूंगा। कनेक्शन सिस्टम संसाधन हैं, आपको उन्हें बर्बाद नहीं करना चाहिए।
साथ ही, कुछ डेटाबेस इंजन, जो कि MySQL के बारे में कोई जानकारी नहीं है, समय-समय पर कचरा-एकत्रित लंबे-निष्क्रिय कनेक्शन होंगे और जब आप इसका उपयोग करने का प्रयास करते हैं तो आपका कनेक्शन अप्रत्याशित रूप से बंद हो जाएगा।
on_message(client, userdata, msg):
try:
mydb = mysql.connector.connect(host="localhost", user="xxxx", passwd="xxxx", database="xxx")
SQL = mydb.cursor()
#☝️ use mysqls parametrized queries
SQL.execute("INSERT INTO logs(deviceID) VALUES (%s)", (msg,))
except Exception as e:
raise
else:
SQL.close()
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।