Разница между базой данных и SQL-бэкэндами в Beaker? - PullRequest
6 голосов
/ 01 ноября 2011

Похоже, Стакан поддерживает две базы данных: ext: database и ext: sqla, но в чем разница между ними?

1 Ответ

6 голосов
/ 17 января 2013

Обзор

Глядя на исходный код (Beaker-1.6.4-py2.7.egg), инициализация бэкенда отличается и схема базы данных немного отличается.

Ключевое различие заключается в том, хотите ли вы использовать ранее существующее соединение SQLAlchemy (ext: sqla) или создать новое соединение (ext: database).

Кроме того, ext: база данных может быть полностью настроена в файлах конфигурации ini, в то время как ext: sqla не может.

Подробности: Config

В файле конфигурации ext: database необходимо указать не менее session.url, чтобы указать базу данных. Вы можете указать session.table_name для указания на таблицу (если вы использовали что-то отличное от beaker_cache по умолчанию), а также session.schema_name, если вы хотите играть с дополнительными настройками. Наконец, session.sa_opts может быть указан со словарем опций для механизма SQLAlchemy.

ext: sqla требуется только объект привязки (объект SQLAlchemy Engine или Connection) и связанный объект таблицы SQLAlchemy. Достаточно просто динамически установить эти значения при вызове Конфигуратора Пирамиды. Поскольку файл конфигурации может принимать только строки, поле ext: sqla не может быть установлено в файле конфигурации ini.

Подробности: схема таблицы

Схемы таблиц также немного отличаются. ext: схема базы данных, за которой следует ext: sqla schema:

cache = sa.Table(table_name, meta,
    sa.Column('id', types.Integer, primary_key=True),
    sa.Column('namespace', types.String(255), nullable=False),
    sa.Column('accessed', types.DateTime, nullable=False),
    sa.Column('created', types.DateTime, nullable=False),
    sa.Column('data', types.PickleType, nullable=False),
    sa.UniqueConstraint('namespace'),
    schema=schema_name if schema_name else meta.schema
)

sa.Table(table_name, metadata,
    sa.Column('namespace', sa.String(255), primary_key=True),
    sa.Column('accessed', sa.DateTime, nullable=False),
    sa.Column('created', sa.DateTime, nullable=False),
    sa.Column('data', sa.PickleType, nullable=False),
    schema=schema_name if schema_name else metadata.schema)

Схема ext: database выдает ошибку, если используется как есть, потому что id должен иметь значение по умолчанию. В Postgres просто создайте тип как Serial вместо Integer, чтобы автоматически генерировать значения по умолчанию.

Ext: sqla является полным подмножеством схемы ext: database, хотя первичные ключи отличаются. PK для ext: sqla является пространством имен, но поскольку схема для ext: database делает пространство имен UNIQUE и NOT NULL, все требования выполняются, чтобы рассматривать его как первичный ключ. Было бы целесообразно всегда реализовывать схему ext: database на тот случай, если вы захотите переключиться между ext: sqla и ext: database. ext: sqla использует автоматический выбор, используя SQLAlchemy PickleType для столбца данных. Создание таблицы в бэкэнде вручную, а не разрешение ext: sqla на ее создание, по-видимому, препятствует выполнению этого автоматического выбора.

Видимая разница клавиш

Поместите что-то вроде этого в файл конфигурации:

sqlalchemy.url = postgresql://user@host.com/particulardb
...
session.type = ext:database
session.url = postgresql://user@host.com/particulardb

Несмотря на то, что ext: database session.url и sqlalchemy.url являются одной и той же базой данных, из экземпляра Pyramid будут установлены два соединения.

ext: sqla исправит создание двух соединений; как только sqlalchemy.url привязан к движку SQLAlchemy, этот движок может использоваться ext: sqla вместо создания нового соединения.

Я думаю, что это достаточно распространенный вариант использования (ext: sqla SQLAlchemy Engine = pyramid SQLAlchemy Engine), чтобы иметь специальную обработку в статическом конфигурационном файле. Если такая специальная обработка существует, я не нашел ее.

...