连接管理在Python中使用数据库

时间:2015-12-24 20:05:03

标签: python database-connection pymssql

我有一个使用db操作的类,如下所示:

class DepartmentOperations(DatabaseOperations):

def __init__(self):
    try:
        self._connection = Database.create_connection()
        self._cursor = self._connection.cursor()
        self.isactive = True
    except ConnectionException as ex:
        print(ex.args)

def get_id(self, department_name):
    if(self.isactive):
        try:
            self._cursor.execute("select BolumId from BOLUMLER where BolumAdi = %s" , department_name)
            row = self._cursor.fetchone()
            if row is not None:
                return row[0]
            else:
                return 0
        except:
            raise DbException("Kayıt Getirirken Hata OLuştu...")
        finally:
            self._connection.close()
            self._cursor.close()
            self.isactive = False
    else:
        try:
            self._connection = Database.create_connection()
            self._cursor = self._connection.cursor()
            self.isactive = True
        except ConnectionException as ex:
            print(ex.args)
        try:
            self._cursor.execute("select BolumId from BOLUMLER where BolumAdi = %s" , department_name)
            row = self._cursor.fetchone()
            if row is not None:
                return row[0]
            else:
                return 0
        except:
            raise DbException("Kayıt Getirirken Hata OLuştu...")
        finally:
            self._connection.close()
            self._cursor.close()
            self.isactive = False



def add(self, department_name):
    if(self.isactive):
        try:
            self._cursor.execute("insert into BOLUMLER values (%s)",(department_name))
            self._connection.commit()
        except:
            raise DbException("Veri kayıt ederken hata oluştu.")
        finally:
            self._connection.close()
            self._cursor.close()
            self.isactive = False
    else:
        try:
            self._connection = Database.create_connection()
            self._cursor = self._connection.cursor()
            self.isactive = True
        except ConnectionException as ex:
            print(ex.args)
        try:
            self._cursor.execute("insert into BOLUMLER values (%s)",(department_name))
            self._connection.commit()
        except:
            raise DbException("Veri kayıt ederken hata oluştu.")
        finally:
            self._connection.close()
            self._cursor.close()
            self.isactive = False

当我实例化这个类并使用它时,第一次但不是第二次工作,因为你在finally块的代码中看到我关闭了连接。我删除finally块方法工作正常,但当我关闭连接。我如何管理连接?

2 个答案:

答案 0 :(得分:1)

  1. 如果您使用的是Web应用程序,最好不要保持连接处于打开状态,而是可以使用with声明:
  2. 像这样:

    with pymssql.connect(server, user, password, "tempdb") as conn:
        with conn.cursor(as_dict=True) as cursor:
            cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
            for row in cursor:
                print("ID=%d, Name=%s" % (row['id'], row['name']))
    

    这样,连接将在上下文中打开和关闭。

    1. 您可以检查连接是否仍然有效:
    2. 使用try / except,如果数据库连接已关闭,请重新打开它。

答案 1 :(得分:0)

您可以使用自定义池:

def pool(ctor, limit=None):
    local_pool = multiprocessing.Queue()
    n = multiprocesing.Value('i', 0)
    @contextlib.contextmanager
    def pooled(ctor=ctor, lpool=local_pool, n=n):
        # block iff at limit
        try: i = lpool.get(limit and n.value >= limit)
        except multiprocessing.queues.Empty:
            n.value += 1
            i = ctor()
        yield i
        lpool.put(i)
    return pooled

示例:

def do_something():
    try:
        with connection.cursor() as cursor:
            # Create a new record
            sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
            cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

        connection.commit()

        with connection.cursor() as cursor:
            # Read a single record
            sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
            cursor.execute(sql, ('webmaster@python.org',))
            result = cursor.fetchone()
            print(result)
    finally:
        connection.close()

然后

my_pool = pool(lambda: do_something())
with my_pool() as my_obj:
    my_obj.do_something()

PYDAL:

我建议您使用pydal,扩展文档here

一般用法是这样的:(几乎每个数据库使用):

from pydal import DAL
db = DAL('mysql://username:password@localhost/test', pool_size=150)

class DALHandler(Object):
    def __init__(self, db):
        self.db = db

    def on_start(self):
        self.db._adapter.reconnect()

    def on_success(self):
        self.db.commit()

    def on_failure(self):
        self.db.rollback()

    def on_end(self):
        self.db._adapter.close()