看起来Beaker支持两个数据库后端,ext:database和ext:sqla,但它们之间有什么区别?
答案 0 :(得分:6)
查看源代码(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
如果您想要使用额外设置。最后,可以使用SQLAlchemy引擎的选项字典指定session.sa_opts
。
ext:sqla只需要一个绑定对象(SQLAlchemy Engine或Connection对象)和一个绑定的SQLAlchemy Table对象。在调用Pyramid的Configurator时,很容易动态设置这些值。由于配置文件只能接受字符串,因此无法在ini配置文件中设置ext:sqla字段。
表格架构也略有不同。 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:数据库模式将会出错,因为id需要具有默认值。在Postgres中,只需将类型创建为Serial而不是Integer即可自动生成默认值。
ext:sqla是ext:数据库架构的完整子集,即使主键不同。 ext:sqla的PK是命名空间,但由于ext:database的模式使命名空间为UNIQUE而非NULL,因此满足所有要求将其视为主键。如果希望在ext:sqla和ext:database之间进行更改,则始终实现ext:database模式是有意义的。 ext:sqla通过对数据列使用SQLAlchemy PickleType来使用自动pickle。手动在后端创建表,而不是允许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 Engine,该引擎可以由ext:sqla使用,而不是创建新连接。
我认为这是一个常见的用例(ext:sqla SQLAlchemy Engine =金字塔SQLAlchemy Engine),可以在静态配置文件中进行特殊处理。如果存在这种特殊处理,我还没有找到它。