Создание объединенных объектов (Python) - PullRequest
2 голосов
/ 29 декабря 2011

Я пишу скрипт, который требует взаимодействия с несколькими базами данных (не одновременно).Чтобы облегчить это, я включаю информацию, связанную с БД (соединения и т. Д.) В словарь.Кроме того, я использую 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 ​​(поскольку ни один код еще не использует эту ссылку - пул все еще настраивается).

Короче говоря, код выше? ОК, а если нет, то почему нет - то есть, как я могу это исправить в отношении проблем, упомянутых выше?

1 Ответ

4 голосов
/ 29 декабря 2011

Код у вас есть очень хорошо.

То, что вы используете одно и то же имя переменной, не означает, что вы переопределяете (или освобождаете) другой объект, который был назначен этой переменной.Фактически, вы можете смотреть на имена как временные метки для ваших объектов.

Теперь вы сохраняете конечные объекты в глобальном словаре pooled_objects, что означает, что пока ваша программаготово или ваше удаление данных оттуда явно, GC не собирается их освобождать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...