跳转到主要内容

SQLAlchemy/Zope2事务集成

项目描述

简介

炼金术士工具箱的领导部分。

是的,它又是另一个SQLAlchemy/Zope集成包。我很抱歉,我确实是。非常感谢Andreas Jung的z3c.sqlalchemy和Kapil Thangavelu的ore.alchemist。我借用Andreas从Kapil那里得到的Zope事务数据管理器代码,我相信。

此包的目的是仅作为领导部分。金子制造的部分留给SQLAlchemy。这意味着在构建SQLAlchemy表元数据和映射器时,没有抽象或延迟初始化或自动检测表,没有生成Zope 3接口,没有CRUD操作,也没有跳舞的北极熊。

您需要理解SQLAlchemy才能理解此包和此README。请参阅https://sqlalchemy.org.cn/docs/

请注意,此包仅用作其他包中的工具;您不能直接在Zope站点中安装它。

使用案例

  • 您想要SQLAlchemy

  • 您想要按名称查找数据库连接/会话作为命名实用程序

  • 您想要使用简单的领域/映射器类,没有特定的依赖关系

  • 您不希望担心事务和连接处理

  • 您希望在运行时配置SQL连接参数,例如在ZODB中。好吧,您不必这样做,但有一个选项是很好的。

您必须做什么

假设我们有一些领域类TableOne和TableTwo,它们与表table1和table2相关。

>>> class TableOne(object):
...     pass
>>> class TableTwo(object):
...     pass

您应该继承collective.lead.Database,填充其模板方法,然后将新类注册为全局、非持久的带IDatabase名称的实用工具。

>>> from collective.lead import Database
>>> import sqlalchemy as sa
>>> class MyDatabase(Database):
...     @property
...     def _url(self):
...         return sa.engine.url.URL(drivername='mysql', username='user',
...                    host='localhost',  database='testdb')
...
...     def _setup_tables(self, metadata, tables):
...         tables['table1'] = sa.Table('table1', metadata, autoload=True)
...         tables['table2'] = sa.Table('table2', metadata, autoload=True)
...
...     def _setup_mappers(self, tables, mappers):
...         mappers['table1'] = sa.mapper(TableOne, tables['table1'])
...         mappers['table2'] = sa.mapper(TableTwo, tables['table2'],
...                                         properties = {
...                                             'table1' : sa.relation(TableOne),
...                                             })

现在可以使用zcml注册数据库实用工具

<utility

provides="collective.lead.interfaces.IDatabase" factory=".database.MyDatabase" name="my.database" />

或者如果您更喜欢直接从Python(XXX这不起作用)

>>> from zope.component import provideUtility
>>> from collective.lead.interfaces import IDatabase
>>> provideUtility(MyDatabase, name='my.database', provides=IDatabase)

使用数据库连接

在应用程序代码中,您现在可以通过名称获取数据库引擎。此引擎是线程局部变量,包含一个单一、缓存的会话。当它首次请求时,将开始一个新事务。这将与Zope事务结合,并在请求结束时相应地提交或回滚。或者换句话说,它应该大致按照您的预期工作,并且您不需要担心事务(无论是Zope还是SQL事务)。

>>> from zope.component import getUtility
>>> db = getUtility(IDatabase, name='my.database')
>>> db.session.query(TableOne).list()
[]
>>> db.connection.execute("SELECT * FROM table1")

变更日志

1.0 - 未发布

  • 初始发布 [optilude]

项目详细信息


下载文件

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

源代码发行版

collective.lead-1.0.tar.gz (12.5 kB 查看散列)

上传时间 源代码

构建发行版

collective.lead-1.0-py2.5.egg (18.9 kB 查看散列)

上传时间 源代码

collective.lead-1.0-py2.4.egg (18.9 kB 查看散列)

上传时间 源代码

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面