在sqlalchemy中清洁物品的优雅方式?

时间:2012-06-27 23:28:56

标签: python sqlalchemy

目前我正在开发一个抽象SQLAlchemy的类。此类将充当帮助工具以验证数据库中的值。该类将用于回归/负载测试。测试用例将使数十万个数据库查询。我班级的布局如下。

class MyDBClass:
    def __init__(self, dbName)
         self.dbName = dbName
         self.dbEngines[dbName] = create_engine()
         self.dbMetaData[dbName] = MetaData()
         self.dbMetaData[dbName].reflect(bind=self.dbEngines[dbName])
         self.dbSession[dbName] = sessionmaker(bind=self.dbEngines[dbName])

    def QueryFunction(self,dbName, tablename, some arguments):
          session = self.dbSession[dbName]()
          query = session.query(requiredTable)
          result = query.filter().all()
          session.close()
    def updateFunction(self, dbName, talbeName, some arguments):
          session = self.dbSession[dbName]()
          session.query(requiredTable).filter().update()
          session.commit()
          session.close()
    def insertFunction(self, dbName, tableName, some arguments):
          connection = self.dbEngines[dbName].connect()
          requiredTable = self.dbMetaData[dbName].tables[tableName]
          connection.execute(requiredTable.insert(values=columnValuePair))
          connection.close()
    def cleanClose(self):
          # Code which will remove the connection/session/object from memory.
          # do some graceful work to clean close.

我想编写cleanClose()方法,该方法应该删除此类可能创建的对象。此方法应从内存中删除所有这些对象并提供干净的关闭。这也可以避免内存泄漏。 我无法弄清楚应该从内存中删除所有对象。有人可以建议我在这里调用什么方法吗?

EDIT1:

有什么方法可以衡量不同方法及其变体的性能?
我正在浏览documentation here并意识到我不应该在每个方法中进行会话,而应该创建单个会话实例并在整个过程中使用。请提供您的反馈意见。让我知道在这里做事的最佳方式是什么。

这里将非常感谢任何形式的帮助。

1 个答案:

答案 0 :(得分:3)

要在Python中从内存中删除对象,您只需要停止引用它们。通常不需要显式编写或调用任何方法来销毁或清理对象。因此,MyDBClass的实例将在超出范围时自动清除。

如果您正在谈论关闭SQLAlchemy会话,那么您只需要在其上调用close()方法。

SQLAlchemy会话专为多个事务而设计。您通常不需要多次创建和销毁它。在__init__函数中创建一个会话,然后在QueryFunctionupdateFunction等中使用该会话。