【发布时间】:2015-09-12 09:32:57
【问题描述】:
我正在构建一个模型,该模型在 Postgresql 数据库中进行大部分计算(出于性能原因)。它看起来有点像这样:
def sql_func1(conn):
# prepare some data, crunch some number, etc.
curs = conn.cursor()
curs.execute("SOME SQL COMMAND")
curs.commit()
curs.close()
if __name__ == "__main__":
connection = psycopg2.connect(dbname='name', user='user', password='pass', host='localhost', port=1234)
sql_func1(conn)
sql_func2(conn)
sql_func3(conn)
connection.close()
该脚本使用了大约 30 个单独的函数,例如 sql_func1。显然,一直在每个函数中管理连接和游标有点尴尬。因此,我开始使用 here 描述的装饰器。现在我可以简单地用装饰器@db_connect 包装sql_func1 并从那里传递连接。但是,这意味着我一直在打开和关闭连接,这也不是一个好习惯。 psycopg2 FAQ 说:
创建连接可能会很慢(想想基于 TCP 的 SSL),所以最好 做法是创建单个连接并保持打开状态 必需的。经常回滚或提交也是一个好习惯 (即使在单个 SELECT 语句之后)以确保后端是 从未离开过“闲置交易”。另请参阅 psycopg2.pool 了解 轻量级连接池。
您能否给我一些见解,这将是我的理想实践。我应该使用传递cursor 对象而不是connection 的装饰器吗?如果是这样,请提供装饰器的代码示例。由于我对编程比较陌生,如果您认为我的整体方法有误,请告诉我。
【问题讨论】:
-
您是否将尽可能多的逻辑转移到 SQL 以减少往返次数?
-
@ClodoaldoNeto 模型需要模块化。因此我使用了一系列较小的函数。我没听错你的问题吗?
标签: python postgresql psycopg2