6

Beakerはext:databaseとext:sqlaの2つのデータベースバックエンドをサポートしているようですが、それらの違いは何ですか?

4

1 に答える 1

6

概要

ソースコード(Beaker-1.6.4-py2.7.egg)を見ると、バックエンドの初期化が異なり、データベーススキーマもわずかに異なります。

主な違いは、既存のSQLAlchemy接続(ext:sqla)を使用するか、新しい接続(ext:database)を作成するかということです。

さらに、ext:databaseはini構成ファイル内で完全に構成できますが、ext:sqlaは構成できません。

詳細:構成

構成ファイルで、ext:databaseは、少なくともデータベースsession.urlを指すように定義する必要があります。テーブルを指すように指定することもsession.table_name(デフォルトのbeaker_cache以外のものを使用した場合)、session.schema_name追加の設定をいじる場合も指定できます。最後session.sa_optsに、SQLAlchemyエンジンのオプションの辞書で指定できます。

ext:sqlaには、バインドオブジェクト(SQLAlchemyエンジンまたはConnectionオブジェクト)とバインドされたSQLAlchemyテーブルオブジェクトのみが必要です。PyramidのConfiguratorを呼び出すときに、これらの値を動的に設定するのは簡単です。構成ファイルは文字列のみを受け入れることができるため、init構成ファイルにext:sqlaフィールドを設定することはできません。

詳細:テーブルスキーマ

テーブルスキーマもわずかに異なります。ext:databaseスキーマとそれに続くext:sqlaスキーマ:

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)

idはデフォルト値である必要があるため、ext:databaseスキーマをそのまま使用するとエラーが発生します。Postgresでは、整数ではなくシリアルとしてタイプを作成するだけで、デフォルト値が自動的に生成されます。

ext:sqlaは、主キーが異なっていても、ext:databaseスキーマの完全なサブセットです。ext:sqlaのPKは名前空間ですが、ext:databaseのスキーマでは名前空間がUNIQUEであり、NULLではないため、すべての要件が満たされ、主キーとして扱われます。ext:sqlaとext:databaseの間で変更したい場合に備えて、常にext:databaseスキーマを実装することは理にかなっています。ext:sqlaは、データ列にSQLAlchemyPickleTypeを使用することで自動ピクルスを利用します。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インスタンスから2つの接続が確立されます。

ext:sqlaは、2つの接続の作成を修正します。sqlalchemy.urlがSQLAlchemyエンジンにバインドされると、そのエンジンは、新しい接続を作成する代わりに、ext:sqlaによって使用される場合があります。

これは、静的構成ファイルで特別な処理を行うのに十分な一般的なユースケース(ext:sqla SQLAlchemy Engine = pyramid SQLAlchemy Engine)だと思います。そのような特別な取り扱いが存在する場合、私はそれを見つけていません。

于 2013-01-17T18:57:29.020 に答える