Пользовательский класс повторного подключения python mysql не держит соединение с сервером открытым - PullRequest
1 голос
/ 28 декабря 2011

У меня есть собственный класс, написанный на python для восстановления соединения mysql, если текущее соединение не работает. Единственная проблема заключается в том, что текущий всегда кажется мертвым и всегда входит в блок "исключение" моей попытки исключения.

class DB:
    conn = None
    def connect( self ):
            try:
               self.conn = MySQLdb.connect("localhost", "xxxx", "xxxxxx", "Systems")
            except ( AttributeError, Mysqldb.OperationalError ), e:
               raise e

    def query( self, sql, params ):
            try:
               cursor = self.conn.cursor()
               cursor.execute( sql, ( params ) )
            except ( AttributeError, MySQLdb.OperationalError ), e:
               print 'exception generated during sql connection: ', e
               self.connect()
               cursor = self.conn.cursor()
               cursor.execute( sql, ( params ) )
            cursor.close()
            return cursor

    def close( self ):
            try:
               if self.conn:
                  self.conn.close()
                  print '...Closed Database Connection: ' + self.conn
               else:
                  print '...No Database Connection to Close.'
            except ( AttributeError, MySQLdb.OperationalError ), e:
               raise e

db = DB()
db.query( sql, myParams )

Проблема двоякая. 1) Когда я звоню db.close(), я получаю ...No Database Connection вывод. 2) Каждый раз, когда я выполняю db.query( sql, myParams ), он входит в условие кроме и выводит exception generated during sql connection:

Кажется, что мое соединение с БД закрывается само после каждого запроса. Но я не знаю, почему это произошло. Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

2 голосов
/ 28 декабря 2011
  • При первом вызове на db.query self.conn равен Никто. Так что, действительно, вы всегда получите exception generated during sql connection сообщение при первом звонке db.query. Однако последующие звонки на db.query не будет выдавать это сообщение.

    Если вы добавите

    def __init__(self):
        self.connect()
    

    , тогда self.conn будет инициализирован при создании db = DB(). затем вы не получите сообщение об ошибке. Или, если вы хотите создать соединение только по требованию, просто удалите сообщение об ошибке.

  • Вы можете удалить conn = None из класса DB. Код будет по-прежнему работать в основном таким же образом, вызывая AttributeError, когда self.conn не установлен.

  • Обратите также внимание, что если ваш sql является оператором SELECT, вы не должны вызов cursor.close() в DB.query, так как последующий вызов cursor.fetchall() больше не будет работать.


Вот пример кода, показывающий, что с упомянутыми выше изменениями сообщение exception generated during sql connection печатается только один раз, а db.close() ...Closed Database Connection: как положено.

Если ваш код ведет себя иначе, пожалуйста, измените код ниже, чтобы продемонстрировать поведение.

import MySQLdb
import config

class DB:
    def connect(self):
        try:
            self.conn = MySQLdb.connect("localhost",
                                        config.USER, config.PASS, config.MYDB)
        except (AttributeError, MySQLdb.OperationalError), e:
            raise e

    def query(self, sql, params = ()):
        try:
            cursor = self.conn.cursor()
            cursor.execute(sql, params)
        except (AttributeError, MySQLdb.OperationalError) as e:
            print 'exception generated during sql connection: ', e
            self.connect()
            cursor = self.conn.cursor()
            cursor.execute(sql, params)
        return cursor

    def close(self):
        try:
            if self.conn:
                self.conn.close()
                print '...Closed Database Connection: ' + str(self.conn)
            else:
                print '...No Database Connection to Close.'
        except (AttributeError, MySQLdb.OperationalError) as e:
            raise e

db = DB()
sql = '''DROP TABLE IF EXISTS foo'''
db.query(sql)

sql = '''CREATE TABLE foo (bar INT(11))'''
db.query(sql)

db.close()

# exception generated during sql connection:  DB instance has no attribute 'conn'
# ...Closed Database Connection: <_mysql.connection closed at 8769f8c>

config.py:

USER = 'myusername'
PASS = 'mypasswd'
HOST = 'localhost'
MYDB = 'dbname'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...