创建池化对象(Python)

时间:2011-12-29 16:31:14

标签: python sqlalchemy

我正在编写一个需要与多个数据库交互的脚本(不兼容)。为了促进这一点,我在字典中维护数据库相关信息(连接等)。顺便说一下,我使用sqlAlchemy进行与db的所有交互。我不知道这是否与这个问题有关。

我有一个设置池的功能。看起来有点像这样:

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收集前一个实例(因为还没有代码正在使用该引用 - 池仍在设置中)。

简而言之,上面的代码是否正常?如果没有,为什么不呢? - 即如何解决上述问题呢?

1 个答案:

答案 0 :(得分:4)

你拥有的代码非常好。

仅仅因为您使用相同的变量名称并不意味着您要覆盖(或释放)分配给该变量的另一个对象。实际上,您可以将名称视为对象的临时标签。

现在,您将最终对象存储在全局字典pooled_objects中,这意味着在您的程序完成或明确删除数据之前,GC不会释放它们。