2016-12-11 9 views
6

का उपयोग कर फिर से कनेक्ट नहीं हो सकता है, मैं aiohttp और sqlalchemy का उपयोग कर रहा हूं, और मैंने सिंगलटन बनाया है जो मुझे कनेक्ट करने में मदद करता है जब मुझे SQLAlchemy (कोड निम्न) के उदाहरण की आवश्यकता होती है । दुर्भाग्य से, हर एक बार थोड़ी देर में मैं निम्न त्रुटि (जो मैं सर्वर को पुनः प्रारंभ करके "हल") मिलती है:aiohttp + sqlalchemy: अमान्य लेनदेन वापस

Dec 11 09:35:29 ip-xxx-xxx-xxx-xxx gunicorn[16513]: sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back [SQL: '... \nFROM ...\nWHERE ... = %(username_1)s \n LIMIT %(param_1)s'] [parameters: [{}]]```

वहाँ वर्तमान कोड ठीक करने के लिए कोई तरीका है? धन्यवाद :)

CONNECTION_DETAILS = { 
    'driver': 'pymysql', 
    'dialect': 'mysql', 
    'host': os.environ.get('HOST'), 
    'port': 3306, 
    'user': 'master', 
    'password': os.environ.get('PASSWORD'), 
    'database': 'ourdb', 
    'charset': 'utf8' 
} 

_instance = None 

def __new__(cls, *args, **kwargs): 
    if not cls._instance: 
     con_str = '{dialect}+{driver}://{user}:{password}@' \ 
        '{host}:{port}/{database}?charset={charset}'\ 
      .format(**cls.CONNECTION_DETAILS) 
     try: 
      engine = sqlalchemy.create_engine(con_str) 

      Session = scoped_session(sessionmaker(bind=engine)) 
      session = Session() # Create the ORM handle 
     except sqlalchemy.exc.OperationalError: 
      logger.exception('Establishing database connection error.') 

     cls._instance = super().__new__(cls) 
     logger.debug("Returning database's session.") 
     cls._instance.session = session 

     # Initializing tables 
     cls._instance.Users = Users 
     cls._instance.Services = Services 
     cls._instance.APIKeys = APIKeys 

    return cls._instance 
+0

मुझे आपके प्रश्न के बारे में कोई जानकारी नहीं मिली है, लेकिन आप sqlalchemy के साथ aiohttp का उपयोग क्यों करते हैं? एक async ढांचे के साथ एक non-async ओआरएम? – Juggernaut

+0

मुझे लगता है कि यह एक ही थ्रेड में चल रहे एकाधिक एआईओटीपी अनुरोधों के कारण है, इसलिए 'सत्र' को 'scoped_session' के 'scopefunc' के कारण कई कार्यों के बीच साझा किया जाता है। [यह प्रश्न] देखें (http://stackoverflow.com/questions/34369164/correct-usage-of-sqlalchemy-scoped- सत्र-with-python-asyncio)। – univerio

उत्तर

1

यह काफी देर से उत्तर होगा। ऐसा होता है: सत्र का उपयोग करते समय, एक SQLlchemy त्रुटि उठाई जाती है (कुछ भी जो शुद्ध SQL के रूप में उपयोग किए जाने पर त्रुटि को फेंक देगा: वाक्यविन्यास त्रुटियां, अद्वितीय बाधाएं, कुंजी टकराव आदि)।

आपको यह त्रुटि मिलनी होगी, इसे try/except -block में लपेटें और session.rollback() पर करें।

इसके बाद आप अपने सत्र को दोबारा स्थापित कर सकते हैं।