gpt4 book ai didi

python - 如何仅初始化一次数据库连接并在 python 运行时重用它?

转载 作者:行者123 更新时间:2023-12-05 01:57:33 27 4
gpt4 key购买 nike

我目前正在从事一个庞大的项目,该项目不断执行查询。我的问题是,我的旧代码总是创建一个新的数据库连接和游标,这极大地降低了速度。所以我认为是时候创建一个新的数据库类了,目前看起来像这样:

class Database(object):

_instance = None

def __new__(cls):
if cls._instance is None:
cls._instance = object.__new__(cls)
try:
connection = Database._instance.connection = mysql.connector.connect(host="127.0.0.1", user="root", password="", database="db_test")
cursor = Database._instance.cursor = connection.cursor()
except Exception as error:
print("Error: Connection not established {}".format(error))
else:
print("Connection established")
return cls._instance

def __init__(self):
self.connection = self._instance.connection
self.cursor = self._instance.cursor

# Do database stuff here

查询将像这样使用类:

def foo():
with Database() as cursor:
cursor.execute("STATEMENT")

我不是绝对确定,无论创建类的频率如何,这是否只创建一次连接。也许有人知道如何仅初始化一次连接以及之后如何在类里面使用它,或者可能知道我的解决方案是否正确。感谢您的帮助!

最佳答案

说明

这里的关键字显然是类变量。看看 official documentation ,我们可以看到,除了实例变量之外,类变量由所有类实例共享,而不管存在多少个类实例。

Generally speaking, instance variables are for data unique to each instance and class variables are for attributes and methods shared by all instances of the class:

那么让我们假设您有该类的多个实例。类本身定义如下。

class Dog:

kind = "canine" # class variable shared by all instances

def __init__(self, name):
self.name = name # instance variable unique to each instance

为了更好地理解类变量和实例变量之间的区别,我想在这里包括一个小例子:

>>> d = Dog("Fido")
>>> e = Dog("Buddy")
>>> d.kind # shared by all dogs
"canine"
>>> e.kind # shared by all dogs
"canine"
>>> d.name # unique to d
"Fido"
>>> e.name # unique to e
"Buddy"

解决方案

现在我们知道类变量由类的所有实例共享,我们可以简单地定义连接和游标,如下所示。

class Database(object):

connection = None
cursor = None

def __init__(self):
if Database.connection is None:
try:
Database.connection = mysql.connector.connect(host="127.0.0.1", user="root", password="", database="db_test")
Database.cursor = Database.connection.cursor()
except Exception as error:
print("Error: Connection not established {}".format(error))
else:
print("Connection established")

self.connection = Database.connection
self.cursor = Database.cursor

因此,与数据库的连接在开始时创建一次,然后可供每个后续实例使用。

关于python - 如何仅初始化一次数据库连接并在 python 运行时重用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69145633/

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