Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

SQLAlchemy में mysql पुनरारंभ को संभालें

2011 नोट: मूल उत्तर 2010 से है। अब बेहतर दृष्टिकोण, जैसा कि टिप्पणियों में बताया गया है, लगता है का उपयोग करना पूल_रीसायकल परम

2010 से मूल उत्तर इस प्रकार है।

परीक्षित समाधान के लिए नीचे संपादित करें देखें

मैंने इसे आजमाया नहीं, लेकिन शायद पूल लिस्टनर जाने का रास्ता है?

आप ऐसा कुछ कर सकते हैं:

class MyListener(sqlalchemy.interfaces.PoolListener):
    def __init__(self):
       self.retried = False
    def checkout(self, dbapi_con, con_record, con_proxy):
       try:
           dbapi_con.info() # is there any better way to simply check if connection to mysql is alive?
       except sqlalchemy.exc.OperationalError:
           if self.retried:
               self.retried = False
               raise # we do nothing
           self.retried = True
           raise sqlalchemy.exc.DisconnectionError

# next, code according to documentation linked above follows

e = create_engine("url://", listeners=[MyListener()])

इस तरह हर बार पूल से कनेक्शन की जांच होने वाली है, हम परीक्षण करते हैं कि क्या यह वास्तव में सर्वर से जुड़ा है। यदि नहीं, तो हम sqlalchemy को फिर से जोड़ने का एक मौका देते हैं। उसके बाद, यदि समस्या अभी भी बनी हुई है, तो हम उसे जाने देते हैं।

पीएस:मैंने परीक्षण नहीं किया कि यह काम करता है या नहीं।

संपादित करें:पाइलन्स के लिए, ऊपर दिखाए गए इंजन इनिशियलाइज़ेशन में संशोधनों को your_app.model.init_model (Pylons 0.9.7) या में करने की आवश्यकता होगी। your_app.config.environment.load_environment <स्ट्राइक>(पिलोन 1.0) समारोह - <स्ट्राइक>ये हैं यह है <स्ट्राइक>स्थान वह स्थान जहाँ इंजन इंस्टेंस बनाया जाता है।

संपादित करें

<मजबूत>ठीक है। मैं वर्णित स्थिति को पुन:पेश करने में सक्षम था। ऊपर दिए गए कोड को काम करने के लिए कुछ बदलावों की आवश्यकता है। नीचे बताया गया है कि इसे कैसे किया जाना चाहिए। साथ ही इससे कोई फर्क नहीं पड़ता कि यह 0.9.7 है या 1.0।

आपको your_app/config/environment.py संपादित करने की आवश्यकता है। इन निर्यातों को फ़ाइल के शीर्ष पर रखें:

import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions

और load_environment फ़ंक्शन का अंत इस तरह दिखना चाहिए:

class MyListener(sqlalchemy.interfaces.PoolListener):
    def __init__(self):
       self.retried = False
    def checkout(self, dbapi_con, con_record, con_proxy):
       try:
           dbapi_con.cursor().execute('select now()')
       except _mysql_exceptions.OperationalError:
           if self.retried:
               self.retried = False
               raise
           self.retried = True
           raise sqlalchemy.exc.DisconnectionError

config['sqlalchemy.listeners'] = [MyListener()]

engine = engine_from_config(config, 'sqlalchemy.')
init_model(engine)

इस बार मैं इसका परीक्षण करने में सक्षम था (Pylons 1.0 + SQLAlchemy 0.6.1 पर) और यह काम करता है। :)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql में अन्य तालिका में मिलान मूल्यों के आधार पर कॉलम अपडेट करें

  2. Json को SQL तालिका में कनवर्ट करना

  3. विशाल MySQL तालिका को हटाने का सबसे तेज़ तरीका

  4. MySQL:एकाधिक टेबल या कई कॉलम वाली एक टेबल?

  5. अजगर 2.6+ पर mysqldb (win32)