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.component、zope.schema 和 zope.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遵循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)
会话从错误的缓存中返回
将回滚/提交处理移动到SessionDataManager内部,以便与TPC更好地协同工作。请参阅http://mail.zope.org/pipermail/zodb-dev/2007-May/010996.html
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 408606526139356e7ec4a6653b0708757d230e2ef7280e37573247666254aecd |
|
MD5 | 8a0376a0bf039b7d8e9f6c90c8854f53 |
|
BLAKE2b-256 | 8dd7b35a4007621f8cc0a4bcb38e25a5e3b949ea839a0783730dc60ec210ceb2 |