Beaker中数据库和sqla后端之间的区别?

Jor*_*ril 6 python beaker

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

Bry*_*yan 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您是否喜欢使用额外设置.最后session.sa_opts可以使用SQLAlchemy引擎的选项字典指定.

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)
Run Code Online (Sandbox Code Playgroud)

如果按原样使用,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
Run Code Online (Sandbox Code Playgroud)

即使ext:database session.url和sqlalchemy.url是同一个数据库,也会从Pyramid实例建立两个连接.

ext:sqla将纠正两个连接的创建; 一旦sqlalchemy.url绑定到SQLAlchemy Engine,该引擎可以由ext:sqla使用,而不是创建新连接.

我认为这是一个常见的用例(ext:sqla SQLAlchemy Engine = pyramid SQLAlchemy Engine),可以在静态配置文件中进行特殊处理.如果存在这种特殊处理,我还没有找到它.