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

2024-03-15

看起来像Beaker http://beaker.groovie.org/支持两种数据库后端,ext:database 和 ext:sqla,但是它们之间有什么区别呢?


Overview

查看源代码(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 Engine 或 Connection 对象)和一个绑定的 SQLAlchemy Table 对象。调用 Pyramid 的配置器时动态设置这些值非常容易。由于配置文件只能接受字符串,因此 ext:sqla 字段都不能在 ini 配置文件中设置。

详细信息:表架构

表模式也略有不同。 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)

如果按原样使用 ext:database 模式将会出错,因为 id 需要有一个默认值。在 Postgres 中,只需将类型创建为 Serial 而不是 Integer 即可自动生成默认值。

ext:sqla 是 ext:database 模式的完整子集,尽管主键不同。 ext:sqla 的 PK 是名称空间,但由于 ext:database 的架构使名称空间唯一且不为 NULL,因此满足将其视为主键的所有要求。如果希望在 ext:sqla 和 ext:database 之间进行更改,则始终实现 ext:database 模式是有意义的。 ext:sqla 通过使用 SQLAlchemy PickleType 作为数据列来利用自动酸洗。在后端手动创建表,而不是允许 ext:sqla 创建它,似乎可以防止这种自动酸洗的发生。

明显的关键区别

将类似这样的内容放入配置文件中:

sqlalchemy.url = postgresql://[email protected] /cdn-cgi/l/email-protection/particulardb
...
session.type = ext:database
session.url = postgresql://[email protected] /cdn-cgi/l/email-protection/particulardb

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

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

我认为这是一个足够常见的用例(ext:sqla SQLAlchemy Engine =金字塔SQLAlchemy Engine),可以在静态配置文件中进行特殊处理。如果存在这种特殊处理,我还没有发现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Beaker 中数据库和 sql 后端的区别? 的相关文章

随机推荐