我正在编写一个需要与多个数据库交互(不是同时)的脚本。为了促进这一点,我在字典中维护数据库相关信息(连接等)。顺便说一句,我使用 sqlAlchemy 进行与数据库的所有交互。我不知道这是否与这个问题相关。
我有一个设置池的函数。它看起来有点像这样:
def setupPool():
global pooled_objects
for name in NAMES:
engine = create_engine("postgresql+psycopg2://postgres:pwd@localhost/%s" % name)
metadata = MetaData(engine)
conn = engine.connect()
tbl = Table('my_table', metadata, autoload=True)
info = {'db_connection': conn, 'table': tbl }
pooled_objects[name] = info
我不确定上面的代码中是否存在任何问题,因为我使用相同的变量名,并且不清楚(至少对我来说)底层指向资源的指针(正在处理连接)。例如,创建另一个引擎(到不同的数据库)并将其分配给“engine”变量会导致前一个实例被GC“收获”(因为还没有代码使用该引用 - 池仍在设置中) )。
简而言之,上面的代码可以吗?如果不行,为什么不行 - 即我如何针对上述问题修复它?
最佳答案
你的代码非常好。
仅仅因为您使用相同的变量名称并不意味着您正在覆盖(或释放)分配给该变量的另一个对象。事实上,您可以将名称视为对象的临时标签。
现在,您将最终对象存储在全局字典 pooled_objects
中,这意味着在您的程序完成或明确从其中删除数据之前,GC
不会进行释放他们。
关于python - 创建池对象 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8670475/