跳转到主要内容

Zope的SQLAlchemy包装器

项目描述

z3c.sqlalchemy是什么?

z3c.sqlalchemy 是围绕 SQLAlchemy 的另一个包装器。该包装器的功能主要集中于与 Zope 的简单集成。包装器关注连接处理、可选的与 Zope 的事务集成以及包装器管理(缓存、内省)。z3c.sqlalchemy 允许您灵活地控制映射器的创建。映射器类可以是

  • 自动生成的(带或不带自动检测表关系)

  • 由开发者配置

z3c.sqlalchemy 不做且不会做的事情

  • 不支持 Zope 3 架构

  • 不支持 Archetypes 架构

z3c.sqlachemy 只尝试为您提供使用 Zope 编写基于 SQLAlchemy 的应用程序所需的基本功能。高级功能,如与 Archetypes/Zope 3 架构的集成,属于高级框架。z3c.sqlalchemy 不处理这些框架。

需求

  • Zope 5 或更高版本

  • SQLAlchemy 1.4 或更高版本

  • zope.sqlalchemy 1.2.0 或更高版本

  • Python 3.7 或更高版本

安装

使用 pip

pip install z3c.sqlalchemy

注意

z3c.sqlalchemy 依赖于模块 zope.componentzope.schemazope.interface。如果您在仅使用 Python 的环境中使用 z3c.sqlalchemy,请确保这些组件作为 eggs 安装,或者通过设置 PYTHONPATH 到相应的 Zope 安装来安装。

使用

基本使用

from z3c.sqlalchemy import createSAWrapper
wrapper = createSAWrapper('postgres://postgres:postgres@host/someDB')
session = wrapper.session
FormatMapper = wrapper.getMapper('format') # auto-generated mapper for table 'format'
for row in session.query(FormatMapper).select(...): print row
session.flush() # if necessary

会话将自动参与 Zope 事务。在事务提交时,包装器将自动调用 session.flush()。请注意,“wrapper.session”将始终在同一个事务和同一个线程中返回相同的会话实例。

对于实际应用,您不希望在每次新的请求中创建一个新的包装器。相反,您希望将包装器实例注册为命名实用程序(ISQLAlchemyWrapper),并在您的应用程序中通过名称查找包装器(该实用程序!)。这种方法与通过获取查找数据库适配器或 ZSQL 方法非常相似。

默认情况下,“wrapper.getMapper(name)”将始终通过使用 SQLAlchemy 自动加载功能自动生成新的映射器类。这种方法的一个缺点是映射器类不知道与其他表的关系。假设我们有一个 A 表与 B 表之间的一对多关系,并且您希望 z3c.sqlalchemy 生成一个了解这种关系的映射器。为此,您可以创建一个带有“model”作为可选参数的包装器。模型基本上是一组配置或提示,用于告诉 z3c.sqlalchemy 如何生成映射器。

示例

from z3c.sqlalchemy import createSAWrapper, Model
model = Model()
model.add(name='A', relations=('B',))
wrapper = createSAWrapper('postgres://postgres:postgres@host/someDB', model=model)
AMapper= wrapper.getMapper('A')

这将生成一个映射器 AMapper,其中 AMapper 的所有实例都有一个名为 'B' 的属性,它与 B 表中的所有对应行相关(请参阅 SQLAlchemy 文档中的映射器、属性和 relation())。在这个示例中,您通过 'relations' 参数(作为相关表名称的序列)显式定义了 A 和 B 之间的关系。

z3c.sqlalchemy 还支持自动检测表之间的关系。不幸的是,SQLAlchemy 不支持这种功能作为开箱即用的可移植方式。因此,z3c.sqlalchemy 的这个功能高度实验性,并且目前仅适用于 Postgres(已测试 Postgres 8.X)。

from z3c.sqlalchemy import createSAWrapper, Model
model = Model()
model.add(name='A', autodetect_relations=True)
wrapper = createSAWrapper('postgres://postgres:postgres@host/someDB', model=model)
AMapper= wrapper.getMapper('A')

在这种情况下,z3c.sqlalchemy 将扫描所有表以自动检测关系,并根据找到的关系构建映射器类及其属性。警告:此功能是实验性的,在第一次请求之前可能需要一些时间来扫描所有表。目前仅支持 'public' 架构中的 Postgres 表)。

在某些情况下,您可能希望为生成的映射器使用自己的基类。此用例也通过使用 'mapper_class' 参数将基类传递给模型来支持。

from z3c.sqlalchemy import createSAWrapper, Model
from z3c.sqlalchemy.mapper import MappedClassBase
class MyAMapper(MappedClassBase): pass
model = Model()
model.add(name='A', relations=('B',) mapper_class = MyAMapper)
wrapper = createSAWrapper('postgres://postgres:postgres@host/someDB', model=model)
AMapper= wrapper.getMapper('A')  # AMapper will be an instance of MyAMapper

当您在 Zope 环境中使用包装器时,通常希望将包装器实例注册为名为 ISQLAlchemyWrapper 的命名实用程序。您可以通过将名称实用程序作为 'name' 参数传递给 createSAWrapper(…, name=’my.postgres.test.db’) 方法来懒加载地执行注册。

通过getSAWrapper方法可以获得通过名称获取包装实例的便捷方法。

createSAWrapper(dsn,..., name='my.name')
...
wrapper = getSAWrapper('my.name')

支持的系统

z3c.sqlalchemy是与Zope一起开发的,基本上针对Postgres 7.4.X和8.X以及SQLite 3.3进行了测试。

已知问题

在没有事务支持的MySQL数据库上运行z3c.sqalchemy可能会在隐式的commit()操作上引起麻烦。因此,目前不支持没有事务支持的MySQL。

作者

z3c.sqlalchemy是由德国弗莱堡的Haufe Mediengruppe的Andreas Jung和德国图宾根的ZOPYX Ltd. & Co. KG编写的。

许可协议

z3c.sqlalchemy遵循Zope公共许可证2.1。

请参阅LICENSE.txt。

致谢

代码的部分部分受到z3c.zalchemy(Juergen Kartnaller,Michael Bernstein等人)和Alchemist/ore.alchemist(Kapil Thangavelu)的影响。感谢Martin Aspeli提供宝贵的反馈。

变更日志

2.2 (2024-04-09)

  • 添加对Python 3.12的支持。

  • 部分撤销了fb7d533aae819dc7e1aef8322c2f2d60a9a1b5d0次提交,该提交导致sqlalchemy会话实例被持久化为实例属性。(#21

2.1.1 (2023-09-06)

  • 修复了DBAPI cursor.execute的事务回滚问题。(#17

2.1 (2023-07-05)

  • 支持SQLAlchemy >= 2.0。(#15

2.0 (2023-03-01)

  • 添加对Python 3.10和3.11的支持。

  • 放弃对Python 2.7、3.5和3.6的支持。

1.5.2 (2020-11-13)

  • 修复MANIFEST以包含变更日志。

1.5.1 (2020-11-13)

  • 在tox配置中添加linting并应用linting修复。

  • 修复setup.py中的安装错误(发布版本1.5.0已损坏)。

1.5.0 (2020-11-13)

  • 添加对Python 3.5-3.9的支持。

  • 标准化命名空间__init__。

  • 修复与zope.sqlalchemy 1.2兼容的问题。

1.4.0 (2009-12-02)

  • 删除与旧版Zope版本的兼容代码。

  • 修复与现代zope.component版本导入问题。

  • 修复自定义映射的注册问题。

1.3.11 (26.10.2009)

  • 在LazyMapperCollection中不创建新的MetaData,而是使用包装器中创建的。在某些情况下,您可能会有一些在包装器中创建的元数据表,以及一些在LazyMapperCollection中创建的元数据表,这会导致在尝试创建关系时出错。

  • 在生成映射器类时,确保table.name是一个字符串。当使用MySQL引擎的use_unicode=1时,它可以是一个Unicode。

1.3.10 (04.08.2009)

  • 删除了SA弃用警告

1.3.9 (06.01.2009)

  • 使'twophase'可配置

1.3.8 (06.01.2009)

  • 用dictish代理实现替换asDict()

1.3.7 (12.12.2008)

  • 更好地支持SQLAlchemy声明性层

1.3.6 (23.11.2008)

  • zip_safe=False

1.3.5 (05.09.2008)

  • 恢复了与SA 0.4.X的兼容性

1.3.4 (04.09.2008)

  • 添加了‘extension_options’参数

1.3.2 (29.07.2008)

  • 将依赖关系更新到最新的zope.sqlalchemy版本

1.3.1 (24.06.2008)

  • 放宽zope.*依赖关系

1.3.0 (02.06.2008)

  • 支持sqlalchemy.ext.declarative

1.2.0 (25.05.2008)

  • 现在使用zope.sqlalchemy进行ZODB事务集成

  • 内部类重命名

  • 删除了PythonBaseWrapper。现在只有一个ZopeWrappe类。

  • 需要SQLAlchemy 0.4.6或更高版本

  • 需要zope.sqlalchemy 0.1或更高版本

1.1.5 (08.05.2008)

  • 在回滚情况下改进了错误处理(由Dieter Maurer提供的补丁)

1.1.4 (15.03.2008)

  • 重新组织.txt文件

1.1.3 (20.02.2008)

  • 另一个savepoint修复

  • 修复了由先前更改引入的回归错误:在tpc_finish中准备好时提交zope事务[maurits]

  • 修复了session的交易.nested被调用为一个可调用的错误(它应该是直接属性访问)[Rocky]

1.1.2 (16.02.2008)

  • 修复了ZODB savepoint实现。现在返回一个适当的虚拟savepoint

1.1.1 (13.02.2008)

  • SessionDataManager现在支持ZODB savepoints

1.1.0 (17.01.2008)

  • 警告:此版本需要SA 0.4.X和更高版本

  • 修复了与即将到来的SA 0.4.X系列相关的导入问题

  • create_session()调用(针对SA 0.4.X)

  • unittests支持可选的$TEST_DSN环境,以便针对现有数据库(除SQLite以外的数据库)运行测试。

  • 对Zope事务集成进行了主要重构:现在使用一个DataManager来处理会话对象和连接。通过‘connection’属性返回的连接也用于创建新的‘session’。旧版z3c.sqlalchemy版本使用单独的连接。这允许应用程序在同一个Zope请求/线程中使用会话和连接,而不会遇到事务问题。SQL操作和会话相关的修改应该在同一个事务中完成。

  • 包装器构造函数现在接受两个新的可选字典‘engine_options’和‘session_options’,这些将被传递给引擎和sessionmaker。由Klaus Barthelmann提供的补丁。

  • 映射对象现在提供了一个asDict()方法来返回对象的值作为字典。

1.0.11 (30.07.2007)

  • 用MetaData()替换了BoundMetaData()(需要SA 0.3.9+)

  • 为了避免目前zope.*版本不匹配,移除了zope.*依赖

1.0.10 (16.07.2007)

  • 使用Zope 3.3.X作为固定依赖

1.0.9 (08.07.2007)

  • 添加了命名空间声明

  • 将文档reST化

1.0.8 (28.06.2007)

  • SessionDataManager:尽可能晚地创建会话事务,并且仅在必要时创建,以最小化死锁。因此,z3c.sqlalchemy不再在当前会话中只有SELECT操作时创建事务。

1.0.7 (27.06.2007)

  • SessionDataManager:将提交代码从tpc_vote()移动到tpc_finish()(感谢Christian Theune的提示)

1.0.6 (25.06.2007)

  • 向setup.py添加了‘namespace_packages’指令

  • 缓存‘metadata’属性

1.0.5 (13.06.2007)

  • 现在应该安全地在同一个Zope事务中使用来自多个包装器的会话。在z3c.sqlalchemy的早期版本中,在同一个事务中调用wrapper1.session和wrapper2.session会返回绑定到wrapper1的会话。

1.0.4 (09.06.2007)

  • 添加了新的‘transactional’标志(仅由SQLAlchemyDA使用)

1.0.3 (26.05.2007)

  • 为Model.add()添加了新的‘cascade’参数

  • 稍微调整了ZODB事务集成

1.0.2 (13.05.2007)

  • MappedClassBase有一个新的方便方法getMapper(),它返回与当前mapper关联的mapper类

1.0.1(未发布)

  • MappedClassBase:新增加clone()方法

  • 在Model.add()中增加了更多的检查

1.0.0 (05.05.2007)

  • 源代码优化

  • 更新文档

0.1.13 (05.05.2007)

0.1.12 (03.05.2007)

  • createSAWrapper()获得了一个新的可选的‘name’参数,以便自动注册包装器而不是使用专门的registerSAWrapper(wrapper, name)调用

0.1.11 (02.05.2007)

  • 增加了对‘mapper_class’属性的检查(从现在起,类必须是MapperClassBase的子类)

  • 现在,一个Zope感知的SAWrapper有一个可以用来直接执行SQL语句的‘connection’属性。‘connection’是sqlalchemy.Connection的一个实例,并与当前的Zope事务直接相关。

  • 由于事务的id不可靠(不同的事务对象可以重复使用相同的内存地址,导致缓存错误),因此更改了Zope包装器的连接和会话对象的缓存

0.1.10 (30.04.2007)

  • 在mapper中修复了一个bug(不幸的是,我忘记提交必要的更改)

  • 移除了0.1.9中引入的‘primary_key’参数,因为我们不需要。它可以在模型内部使用PrimaryKeyConstraint()定义

  • createSAWrapper:对于非postgres DSN,现在设置forZope=True也会返回一个Zope感知的包装器实例(而不是BaseWrapper实例)。(由Martin Aspeli报告)

0.1.9 (26.04.2007)

  • base.py:现在‘model’参数也可以是一个返回model.Model实例的可调用对象

  • base.py:调用模型提供者或提供模型的方法,并传递BoundMetaData实例,以允许自动加载表

  • Model.add() 函数新增了 'primary_key' 参数,用于指定主键提示。当尝试将视图自动加载为无主键信息的 Table() 时,此功能非常有用。'primary_key' 参数可以是 None 或列名序列。

0.1.8 (23.04.2007)

  • 添加了简短的方法名作为别名

  • 如果模型中已定义自定义映射类,则不会生成新的映射类

0.1.7 (21.04.2007)

  • 将构造函数的 'echo' 参数替换为通用关键字参数,以便为 create_engine 提供完整的参数支持。传递给构造函数的可选参数将直接传递给 create_engine()

  • 略微修复了文档

  • 将 registerMapper() 添加到 BaseWrapper 类

  • registerSQLAlchemyWrapper() 现在将注册延迟到第一次在调用 getSQLAlchemyWrapper() 时使用 Wrapper

  • Model.add() 的 'name' 参数现在支持模式(如果可用)。例如,当使用 Postgres 时,可以通过 '.' 引用不同模式中的表。

  • Model.add() 接受一个新可选参数 'table_name',可以在希望将 'name' 参数用作相关表/映射器的别名时指定表名(包括模式信息)。

0.1.6 (28.03.2007)

  • 修复了 registerSQLAlchemyWrapper 中的错误

0.1.5 (28.03.2007)

  • registerSQLAlchemyWrapper() 现在应与 Zope 2.8-2.10 兼容

  • DataManager 类内部定义了两次 abort()

0.1.4 (21.03.2007)

  • Model 类现在(在需要时)表现为一个有序字典。其 items() 方法必须按插入顺序返回所有项目。

0.1.3 (20.03.2007)

  • 添加了 getMappers() 便利方法

  • Zope 包装器使用 SessionTransactions,以便能够以具有事务的会话进行 flush(),以读取同一事务中先前插入的行

0.1.2(未发布)

  • 修复了与 Postgres 包装类相关的类层次结构问题

0.1.1(未发布)

  • 修复了 setup.py

0.1 (18.03.2007)

  • 初始版本

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源分发

z3c.sqlalchemy-2.2.tar.gz (26.2 kB 查看哈希值)

上传时间

构建分发

z3c.sqlalchemy-2.2-py3-none-any.whl (22.4 kB 查看哈希值)

上传时间 Python 3

支持