Соединения SQLAlchemy, пул и SQLite

Итак, мой дизайн требует отдельного файла SQLite для каждого «проекта».. Я более внимательно читаю документы SQLAlchemy Pooling. отдельный движок подключения для каждого проекта.. Согласны??

В этом случае, когда я создаю движок, я либо подключаюсь к файлу, названному по соглашению, либо создаю новый файл SQLite и предоставляю шаблон схемы... ??


person Community    schedule 02.09.2009    source источник


Ответы (2)


Эм, что? Пулы соединений содержат множество соединений с одним и тем же сервером (базы данных). Для установления нового соединения требуется время, поэтому при наличии множества кратковременных процессов, использующих одну и ту же базу данных, удобно иметь пул уже установленных соединений. Процессы могут проверять соединение, делать свое дело и возвращать его, не дожидаясь открытия нового соединения.

В любом случае все подключения идут к одной и той же базе данных, заданной URI, переданным create_engine.

person Jochen Ritzel    schedule 03.09.2009

Во-первых, немного словарного запаса. SQLAlchemy определяет схемы с объектами MetaData, содержащими объекты, представляющие таблицы и другие объекты базы данных. Объекты метаданных могут быть необязательно "привязаны" к механизмам, которые вы называете "пулами".

Чтобы создать стандартную схему и использовать ее в нескольких базах данных, вам потребуется создать один объект метаданных и использовать его с несколькими механизмами, каждый из которых представляет собой базу данных, к которой вы подключаетесь. . Вот пример из интерактивной подсказки iPython. Обратите внимание, что каждый из этих механизмов SQLite подключается к разным базам данных в памяти; соединение1 и соединение2 не подключаются к одной и той же базе данных:

In [1]: from sqlalchemy import *
In [2]: metadata = MetaData()
In [3]: users_table = Table('users', metadata,
   ...:                     Column('id', Integer, primary_key=True),
   ...:                     Column('name', String))
In [4]: connection1 = create_engine('sqlite:///:memory:')
In [5]: connection2 = create_engine('sqlite:///:memory:')

In [6]: ## Create necessary tables
In [7]: metadata.create_all(bind=connection1)
In [8]: metadata.create_all(bind=connection2)

In [9]: ## Insert data
In [10]: connection1.execute(
             users_table.insert(values={'name': 'Mike'}, bind=connection1))
In [11]: connection2.execute(
             users_table.insert(values={'name': 'Jim'}, bind=connection2))

In [12]: print connection1.execute(users_table.select(bind=connection1)).fetchall()
[(1, u'Mike')]

In [13]: print connection2.execute(users_table.select(bind=connection2)).fetchall()
[(1, u'Jim')]

Как видите, я подключаюсь к двум базам данных sqlite и выполняю операторы для каждой, используя общую схему, хранящуюся в моем объекте metedata. На вашем месте я бы начал с метода create_engine и не беспокоился о пуле. Когда придет время для оптимизации, вы можете настроить подключение баз данных, используя аргументы для create_engine.

person Ken Kinder    schedule 08.09.2009