我有一个问题,我的Classes继续创建新的数据库连接,而我正在试图理解我做错了什么...这是我的结构:
index.py
|_ a/const.py ( not a Class, just several functions )
db = None
def get_connection():
global db
if not db:
db = created_new_connection()
print "New connection has been created"
else:
print "Connection already exists"
return db
|_ a/group.py ( import const, Class )
|_ a/user.py ( import const, Class )
“index.py”导入“const”和另一个后来使用“group”和“user”的模块
当我运行index.py时,我得到:
group.py "New connection has been created"
user.py "New connection has been created"
因此,对于测试,我尝试在“index.py”中创建连接,但现在我得到了:
index.py "New connection has been created"
group.py run func1() "Connection already exists"
group.py run func2() "Connection already exists"
user.py "New connection has been created"
现在 - 我很困惑。 “组”和“用户”的写法几乎完全相同。如果“group”运行“get_connection()”它按预期工作(已经存在),之后当“user”运行“get_connection()”时它会创建一个新连接....
有趣的是(对我来说)当我在相同目录中创建文件(a,b,c,d)(以保持结构)并在所有文件中导入“c.py”时,“a”创建了连接,但“b和d”没有创建新连接,他们使用了仍然打开的连接....(这是我所期待的)
有什么想法吗?提前谢谢......
答案 0 :(得分:1)
尝试将其更改为:
def get_connection():
global db
if not db:
db = created_new_connection()
print "New connection has been created"
else:
print "Connection already exists"
return db
如果你有这个,那么函数第二次进入第一个块的唯一可能性是created_new_connection()
函数返回一个评估为False
的东西(例如None
或者空str
或空list
,...)。
或者,您可能会遇到Python加载模块两次的情况,如here所述:基本上如果您使用不同的相对路径导入模块,Python会将它们视为不同的模块,并加载它们两次。此博客文章中建议的解决方案是始终使用其顶级路径加载模块。
答案 1 :(得分:0)
您也可以考虑使用“Borg”类,而不是使用全局变量。这是单例类的Python替代。
<强> database.py 强>
class Database:
__shared_state = {}
db = None
def __init__(self):
self.__dict__ = self.__shared_state
def get_connection(self):
if not self.db:
self.db = self.create_new_connection()
print "New connection has been created"
else:
print "Connection already exists"
return self.db
def create_new_connection(self):
# create and return new connection
然后像from database import Database
一样导入此类,并获得与Database().get_connection()
的连接。