Разница между базой данных и бэкэндами sqla в Beaker?

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

1 ответ

Решение

обзор

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

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

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

Подробности: Конфиг

В файле конфигурации 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) для специальной обработки в статическом конфигурационном файле. Если такая специальная обработка существует, я не нашел это.

Другие вопросы по тегам