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