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