Beaker中数据库和sql后端的区别?

时间:2011-11-01 13:14:22

标签: python beaker

看起来Beaker支持两个数据库后端,ext:database和ext:sqla,但它们之间有什么区别?

1 个答案:

答案 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),可以在静态配置文件中进行特殊处理。如果存在这种特殊处理,我还没有找到它。