2016-07-06 5 views
5

PostgreSQL docs से BEGIN पर:मैं psycopg2 में अपवादों के लिए PostgreSQL चेतावनियों को कैसे बढ़ावा दूं?

शुरू जब पहले से ही एक सौदे ब्लॉक के अंदर एक चेतावनी संदेश भड़काने जाएगा जारी करने वाले। लेनदेन की स्थिति प्रभावित नहीं है।

मैं psycopg2 उठाने के किसी भी तरह के चेतावनी पर एक अपवाद कैसे बना सकते हैं?

उत्तर

2

मैं जा रहा psycopg2 या Postgres विशेषज्ञ से बहुत दूर हूँ, और, मुझे यकीन है कि वहाँ चेतावनी स्तर को बढ़ाने के लिए एक बेहतर समाधान है, लेकिन यहाँ कुछ है कि मेरे लिए काम किया है - अगर वहाँ a custom cursor जो connection notices में लग रहा है और, वहां कुछ है - यह एक अपवाद फेंकता है। कार्यान्वयन में ही ज्यादातर शिक्षा उद्देश्यों के लिए है - मुझे यकीन है कि यह आपके उपयोग के मामले में काम करने के लिए समायोजित करने की आवश्यकता हूँ:

import psycopg2 

# this "cursor" class needs to be used as a base for custom cursor classes 
from psycopg2.extensions import cursor 

class ErrorThrowingCursor(cursor): 
    def __init__(self, conn, *args, **kwargs): 
     self.conn = conn 
     super(ErrorThrowingCursor, self).__init__(*args, **kwargs) 

    def execute(self, query, vars=None): 
     result = super(ErrorThrowingCursor, self).execute(query, vars) 

     for notice in self.conn.notices: 
      level, message = notice.split(": ") 
      if level == "WARNING": 
       raise psycopg2.Warning(message.strip()) 

     return result 

प्रयोग नमूना:

conn = psycopg2.connect(user="user", password="secret") 
cursor = conn.cursor(conn, cursor_factory=ErrorThrowingCursor) 

यह एक psycopg2.Warning की (एक अपवाद फेंक टाइप करें) यदि एक क्वेरी निष्पादन के बाद एक चेतावनी जारी की गई थी। नमूना:

psycopg2.Warning: there is already a transaction in progress 
+0

यह बहुत साफ दिखता है। यह अच्छा होगा अगर 'psycopg' ने बॉक्स के बाहर ऐसे कर्सर का समर्थन किया। – planetp

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