Beakerはext:databaseとext:sqlaの2つのデータベースバックエンドをサポートしているようですが、それらの違いは何ですか?
1 に答える
概要
ソースコード(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)だと思います。そのような特別な取り扱いが存在する場合、私はそれを見つけていません。