gpt4 book ai didi

python - 应用程序与数据库的一个连接,还是每次执行时都连接?

转载 作者:行者123 更新时间:2023-12-03 08:00:20 25 4
gpt4 key购买 nike

我正在使用psycopg2连接到我的 postgresql 数据库的库。每次我想执行任何查询时,我都会像这样建立一个新连接:

import psycopg2

def run_query(query):
with psycopg2.connect("dbname=test user=postgres") as connection:
cursor = connection.cursor()
cursor.execute(query)
cursor.close()

但我认为为整个应用程序执行建立一个连接会更快:

import psycopg2


connection = psycopg2.connect("dbname=test user=postgres")


def run_query(query):
cursor = connection.cursor()
cursor.execute(query)
cursor.close()

那么在我的应用程序的所有执行时间内连接数据库的更好方法是什么?

我尝试了两种方法并且都有效,但我想知道哪种更好以及为什么。

最佳答案

您应该强烈考虑使用连接池,正如其他答案所建议的那样,这比每次查询时创建连接的成本要低,并且可以处理单独一个连接无法处理的工作负载。

创建一个名为 mydb.py 的文件,并包含以下内容:

import psycopg2
import psycopg2.pool
from contextlib import contextmanager

dbpool = psycopg2.pool.ThreadedConnectionPool(host=<<YourHost>>,
port=<<YourPort>>,
dbname=<<YourDB>>,
user=<<YourUser>>,
password=<<YourPassword>>,
)

@contextmanager
def db_cursor():
conn = dbpool.getconn()
try:
with conn.cursor() as cur:
yield cur
conn.commit()
"""
You can have multiple exception types here.
For example, if you wanted to specifically check for the
23503 "FOREIGN KEY VIOLATION" error type, you could do:
except psycopg2.Error as e:
conn.rollback()
if e.pgcode = '23503':
raise KeyError(e.diag.message_primary)
else
raise Exception(e.pgcode)
"""
except:
conn.rollback()
raise
finally:
dbpool.putconn(conn)

这将允许您按如下方式运行查询:

import mydb

def myfunction():
with mydb.db_cursor() as cur:
cur.execute("""Select * from blahblahblah...""")

关于python - 应用程序与数据库的一个连接,还是每次执行时都连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74511042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com