zope的最小sqlalchemy orm会话配置
z3c.saconfig的Python项目详细描述
z3c.saconfig
********
简介
==
此包的目的是提供一种简单而灵活的方法,使用zope组件
架构配置sqlalchemy的作用域会话支持。这个包基于``zope.sqlalchemy``,它
提供zope和sqlalchemy之间的事务集成。
我们在这里列出两个主要场景:
*每个zope实例一个数据库。
*在zope实例中每个站点(或grok应用程序)一个数据库
(因此mu每个zope实例有多个数据库)。
globallyscopedsession(每个zope实例有一个数据库)
========
为zope设置sqlalchemy的最简单方法是有一个对整个zope全局的线程范围的会话
/>实例。多个应用程序都将共享此会话。
引擎是用全局实用程序设置的。
rom sqlalchemy.orm导入关系_ tablename"测试用户"
…id=列('id',integer,primary_key=true)
…name=column('name',string(50))
…addresses=relation("address",backref="user")
>>gt;类地址(基):
…_ tablename_uuu='测试地址'
…id=列('id',integer,primary_key=true)
…email=列('email',字符串(50))
…user_id=column('user_id',integer,foreignkey('test_users.id'))
到目前为止,这与"zope.sqlalchemy"示例没有区别。我们现在得出第一个差异。我们可以将发动机工厂设置为(全局)实用程序,而不是直接制造发动机。此
实用程序确保为我们创建并缓存引擎。
>gt>gt;来自z3c.saconfig import engine factory
>>gt;engine\u factory=enginefactory(test\u dsn)
ory`.
我们现在使用
``zope.component``将引擎工厂注册为全局实用程序。通常,您可以使用zcml或grok进行确认,但我们将在此处手动完成此操作:::::
>;>;来自zope import component
>;>;来自z3c.saconfig.interfaces import iengine factory
>;>;component.provideUtility(engine-factory,provides=iengine工厂)
请注意,在
全局范围的用例中,实际上并不需要设置引擎工厂。您也可以将引擎创建为
全局引擎,并在稍后创建
``globallyscopedsession``时将其传递为``bind`。
让我们通过调用工厂来查找引擎,并在我们的测试数据库中创建表::
>;engine=engine\u factory()
>>>>base.metadata.create_all(engine)
现在讨论与"zope.sqlalchemy"的第二个区别:如何设置和使用
会话。我们将使用"globallyscopedsession"实用程序来实现我们的会话创建:从z3c.saconfig导入globallyscopedsession中:
>;>r
``sqlalchemy.orm.sessionmaker``::
>;>;utility=globallyscopedsession(twopphase=test-twophase)
``globalscopedsession``如果不提供自己的``bind`
参数,则使用``ienginefactory`
查找引擎。`` globallyscopedsession``还自动将
``autocommit`````autoflush``和``extension``参数设置为
es用于zope集成,因此通常不需要
提供这些,但如果需要,您可以传入自己的应用程序。
我们现在将其注册为来自z3c.saconfig.interfaces import iscopedsession
>;>;component.prov的"iscopedsession"实用程序。ideutility(utility,provides=iscopedsession)
我们现在完成配置。正如您所看到的,它包括设置两个实用程序,``ienginefactory``和``iscopedsession``,
在这个全局共享会话
用例中真正需要后者的地方。
3c.saconfig公司。这个"session"类类似于使用
sqlalchemy中的"sessionmaker"生成的类。` z3c.saconfig.session``是您唯一需要的
`` session`类,因为所有配置和zope
集成都是由``z3c.saconfig``自动为您完成的,
在zope中使用它的上下文。不再需要用sessionmaker或scoped session创建session类了,我们现在可以使用session类创建一个session,这个session将根据我们提供的实用程序运行:从z3c.saconfig导入session
>;>;session=session()
现在一切都按照通常的"zope.sqlalchemy"方式进行,就像"sqlalchemy",除了您可以使用zope的"transaction"模块::
>;>;session.query(user).all()
[]br/>>;>;导入事务
>;>会话.add(user(name='bob'))
>;>transaction.commit()
>;>session=session()
>;>bob=session.query(user).all()[0]
>;>bob.name='bob'
>;>true新引擎由"enginefactory"创建,将触发
"ienginecreatedevent"。此事件有一个属性
``engine``它包含刚创建的引擎:
>;>z3c.saconfig.interfaces import ienginecreatedevent
>;@component.adapter(ienginecreatedevent)
…def createdhandler(事件):
…打印("创建的引擎")
…打印("args:{0}"。格式(event.engine\u args))
…打印("kw:{0}"。格式(event.engine戋kw))
>>>>>组件.providehandler(createdhandler)
>>>>事件引擎工厂=引擎(test戋dsn1)
>;引擎=事件引擎工厂()
创建的引擎
参数:("sqlite://:内存:",)
kw:{}
let再次删除事件处理程序:
>;>sm=component.getsitemanager()
>;>sm.unregisterhandler(none,
…Required=[IEngineCreateDevent])
true
SiteScopedSession(每个站点一个数据库)
===
e.sqlalchemy.session``要获得正确的会话。
n’。我们需要先对
``sitescopedsession``进行子类划分,因为我们需要实现它的
``sitescopefunc``方法,该方法应该为每个站点返回一个唯一的id
(例如由``zope.traversing.api.getpath``检索的路径)。我们需要
在这里实现它,因为"z3c.saconfig"将此策略留给
应用程序或更高级别的框架:
>;>;来自z3c.saconfig import sitescopedsession
>;>;类oursitescopedsession(sitescopedsession):
…定义sitescopefunc(self):
…return getsite().id虚拟站点具有唯一的id
>;>utility=oursitescopedsession()
>;>component.providedutility(utility,provides=iscopedsession)
1=引擎(测试DSN1)
>;>;引擎工厂2=引擎(测试DSN2)
我们需要在两个新引擎中设置数据库:
>;>;基元数据。创建全部(引擎工厂1())
>;>;基元数据。创建全部(引擎工厂2())
现在创建两个站点,每个站点都将连接到另一个
引擎::
>>;>;site1=dummysite(id=1)
>;>;site2=dummysite(id=2)
我们为每个站点设置本地引擎工厂:
>;>;sm1=site1.getsitemanager()
>;>;sm1.registerUtility(engine戋factory1,provided=ienginefactory)
>;>sm2=site2.getsitemanager()
>;>sm2.registerUtility(engine戋factory2,provided=ienginefactory)
>;component.provideUtility(none,provides=ienginefactory)
/>当我们将其设置为"site2"时,我们将得到engine factory 2::
>;>set site(site2)
>;>component.get utility(ienginefactory)是engine factory2
true
ITY(iscopedsession)是效用
真
``grok.local_utility``指令来设置本地实用程序。现在,我们可以为"site1"创建一个会话:
>;>;setsite(site1)
>;>;session=session()
ow::
>;>;session.add(user(name='bob'))
>;>;transaction.commit()
``bob``现在已经存在::
>;>;session=session()
>;>;session.query(user).all()[0].name='bob'
true
>>>setsite(site2)
如果我们现在创建一个新会话,我们现在应该使用一个
不同的数据库,该数据库应该仍然是空的:
>;>;session=session()
>;>;session.query(user).a ll()
[]
:
>;>;session.add(user(name='fred'))
>;>;transaction.commit()
>现在"fred"确实存在:
>;>;session=session()
>;>;users=session.query(user).all()
>;>;len(users)
1
>;>;users[0].name=="fred"
true
且"bob"仍在"site1"中:
>;>;setsite(site1)
>;>;session=session()
>;>;users=session.query(user).all()
>;>;len(users)
1
>;>;users[0].name="bob"
true
引擎和线程
==
==
>;>;引擎=无
>;>;def setengine():
…全局引擎
…引擎=引擎工厂1()
t>;engine=none
>;>t=线程。线程(target=setengine)
>;>t.start()
>;>t.join()
>;>engine是引擎工厂1()
true
发动机是发动机工厂1()
false
=======
>提供了一个配置指令,用于使用zcml注册数据库引擎
工厂。
>;>从IO导入bytesio
>;>从zope.configuration导入xmlconfig
>;>导入z3c.saconfig
>;>xmlconfig.xmlconfig('meta.zcml',z3c.saconfig)()
让我们再次尝试注册目录。
>;>;xmlconfig.xmlconfig(bytesio(b""
…<;configure xmlns="http://namespaces.zope.org/db">;
…<;engine name="dummy"url="sqlite:///:内存:"/>;
…<;/configure>;"")
>;>component.getutility(ienginefactory,name="dummy")
<;z3c.saconfig.utility.enginefactory对象位于…>;
这一次是通过一个设置调用。
>;xmlconfig.xmlconfig(bytesio(b""
…<;configure xmlns="http://namespaces.zope.org/db">;
…<;engine name="dummy2"url="sqlite:///:内存:"
…setup="z3c.saconfig.tests.engine_subscriber"/>;
…<;/configure")
got:engine(sqlite:///:memory:)
还可以指定连接池选项:
>;>xmlconfig.xmlconfig(bytesio(b)"
…<;configure xmlns="http://namespaces.zope.org/db">;
…<;engine name="dummy"url="sqlite:///:内存:"
…池大小="1"
…max_overflow="2"
…pool_recycle="3"
…pool_timeout="4"
…/>;
…<;/configure>;"")
>;>;enginefactory=component.getutility(ienginefactory,name="dummy")
>;>;enginefactory.{u kw={convert_unicode':false,'echo':none,'pool_size':1,'max_overflow':2,'pool_recycle':3,'pool_timeout':4}
true
有关连接池的qalchemy文档,了解如何使用这些参数的详细信息。)
提供session指令来注册作用域会话实用程序:
>;>xmlconfig.xmlconfig(bytesio(b""
…<;configure xmlns="http://namespaces.zope.org/db">;
…<;session name="dummy"engine="dummy2"/>;
…<;/configure>;"")
>;>component.getutility(iscopedsession,name="dummy")
<;z3c.saconfig.utility.globallyscopedsession object at…>;
>;>任人唯亲,name="dummy2")
>gt>gt>gt>gt>gt;session=named_scoped_session('dumm')
>gt>gt>gt>gt>gt>gt>gt>gt>gt;session().bind is factory()
true
<0.15(2018-11-30)saconfig
<0.15(2018-11-30)0.15(2018-11-30)0.15(2018-11-11-30)0.15(2018-br/>
======
==========
-fix:`Pithon3兼容性问题,Zope界面实现问题,<;https://github.com/zopefoundation/z3c.saconfig/issues/4>;`[NazrrulWorld]
>0.14(2015-06-29)
===========br/>
>-放弃对sqlalchemy的支持<;0.5
[oggers]
<0.13(2011-07-26)(2011-07-2011-07-26)是的
===
-使用zcml操作注册引擎工厂设置
>0.12(2010-09-28)
==
-enginecreatedevent还将"engine_args"和"engine_kw"作为
属性,以便事件处理程序可以潜在地区分
发动机s.
0.11(2010-07-05)
==
-在
<;engine/>;指令中添加pool_size、max_overflow、pool_recycle和pool_timeout选项。这允许在zcml中定义连接池选项
。
-与sqlalchemy>;=0.5一起使用(与sqlalchemy>;5 previor一起使用)
<0.10(2010-01-18)
====
-支持当前ztk代码
-engine.echo对于sqlal必须默认为nonechemy to荣誉
logging.getlogger("sqlalchemy.engine").setlevel(…)
-默认情况下不启用convert_unicode。此选项通过使字符串类型列返回unicode数据来更改标准的sqlalchemy行为。在ZOPE2环境中,这一点尤其令人痛苦
在ZCML引擎语句中添加convert_unicode选项,允许需要convert_unicode来启用它的用户
<0.9.1(2009-08-14)
=关于PYPI的UDE文档。
-小文档调整。
>0.9(2009-08-14)
===
-首次公开发布。
********
简介
==
此包的目的是提供一种简单而灵活的方法,使用zope组件
架构配置sqlalchemy的作用域会话支持。这个包基于``zope.sqlalchemy``,它
提供zope和sqlalchemy之间的事务集成。
我们在这里列出两个主要场景:
*每个zope实例一个数据库。
*在zope实例中每个站点(或grok应用程序)一个数据库
(因此mu每个zope实例有多个数据库)。
globallyscopedsession(每个zope实例有一个数据库)
========
为zope设置sqlalchemy的最简单方法是有一个对整个zope全局的线程范围的会话
/>实例。多个应用程序都将共享此会话。
引擎是用全局实用程序设置的。
rom sqlalchemy.orm导入关系_ tablename"测试用户"
…id=列('id',integer,primary_key=true)
…name=column('name',string(50))
…addresses=relation("address",backref="user")
>>gt;类地址(基):
…_ tablename_uuu='测试地址'
…id=列('id',integer,primary_key=true)
…email=列('email',字符串(50))
…user_id=column('user_id',integer,foreignkey('test_users.id'))
到目前为止,这与"zope.sqlalchemy"示例没有区别。我们现在得出第一个差异。我们可以将发动机工厂设置为(全局)实用程序,而不是直接制造发动机。此
实用程序确保为我们创建并缓存引擎。
>gt>gt;来自z3c.saconfig import engine factory
>>gt;engine\u factory=enginefactory(test\u dsn)
ory`.
我们现在使用
``zope.component``将引擎工厂注册为全局实用程序。通常,您可以使用zcml或grok进行确认,但我们将在此处手动完成此操作:::::
>;>;来自zope import component
>;>;来自z3c.saconfig.interfaces import iengine factory
>;>;component.provideUtility(engine-factory,provides=iengine工厂)
请注意,在
全局范围的用例中,实际上并不需要设置引擎工厂。您也可以将引擎创建为
全局引擎,并在稍后创建
``globallyscopedsession``时将其传递为``bind`。
让我们通过调用工厂来查找引擎,并在我们的测试数据库中创建表::
>;engine=engine\u factory()
>>>>base.metadata.create_all(engine)
现在讨论与"zope.sqlalchemy"的第二个区别:如何设置和使用
会话。我们将使用"globallyscopedsession"实用程序来实现我们的会话创建:从z3c.saconfig导入globallyscopedsession中:
>;>r
``sqlalchemy.orm.sessionmaker``::
>;>;utility=globallyscopedsession(twopphase=test-twophase)
``globalscopedsession``如果不提供自己的``bind`
参数,则使用``ienginefactory`
查找引擎。`` globallyscopedsession``还自动将
``autocommit`````autoflush``和``extension``参数设置为
es用于zope集成,因此通常不需要
提供这些,但如果需要,您可以传入自己的应用程序。
我们现在将其注册为来自z3c.saconfig.interfaces import iscopedsession
>;>;component.prov的"iscopedsession"实用程序。ideutility(utility,provides=iscopedsession)
我们现在完成配置。正如您所看到的,它包括设置两个实用程序,``ienginefactory``和``iscopedsession``,
在这个全局共享会话
用例中真正需要后者的地方。
3c.saconfig公司。这个"session"类类似于使用
sqlalchemy中的"sessionmaker"生成的类。` z3c.saconfig.session``是您唯一需要的
`` session`类,因为所有配置和zope
集成都是由``z3c.saconfig``自动为您完成的,
在zope中使用它的上下文。不再需要用sessionmaker或scoped session创建session类了,我们现在可以使用session类创建一个session,这个session将根据我们提供的实用程序运行:从z3c.saconfig导入session
>;>;session=session()
现在一切都按照通常的"zope.sqlalchemy"方式进行,就像"sqlalchemy",除了您可以使用zope的"transaction"模块::
>;>;session.query(user).all()
[]br/>>;>;导入事务
>;>会话.add(user(name='bob'))
>;>transaction.commit()
>;>session=session()
>;>bob=session.query(user).all()[0]
>;>bob.name='bob'
>;>true新引擎由"enginefactory"创建,将触发
"ienginecreatedevent"。此事件有一个属性
``engine``它包含刚创建的引擎:
>;>z3c.saconfig.interfaces import ienginecreatedevent
>;@component.adapter(ienginecreatedevent)
…def createdhandler(事件):
…打印("创建的引擎")
…打印("args:{0}"。格式(event.engine\u args))
…打印("kw:{0}"。格式(event.engine戋kw))
>>>>>组件.providehandler(createdhandler)
>>>>事件引擎工厂=引擎(test戋dsn1)
>;引擎=事件引擎工厂()
创建的引擎
参数:("sqlite://:内存:",)
kw:{}
let再次删除事件处理程序:
>;>sm=component.getsitemanager()
>;>sm.unregisterhandler(none,
…Required=[IEngineCreateDevent])
true
SiteScopedSession(每个站点一个数据库)
===
e.sqlalchemy.session``要获得正确的会话。
n’。我们需要先对
``sitescopedsession``进行子类划分,因为我们需要实现它的
``sitescopefunc``方法,该方法应该为每个站点返回一个唯一的id
(例如由``zope.traversing.api.getpath``检索的路径)。我们需要
在这里实现它,因为"z3c.saconfig"将此策略留给
应用程序或更高级别的框架:
>;>;来自z3c.saconfig import sitescopedsession
>;>;类oursitescopedsession(sitescopedsession):
…定义sitescopefunc(self):
…return getsite().id虚拟站点具有唯一的id
>;>utility=oursitescopedsession()
>;>component.providedutility(utility,provides=iscopedsession)
1=引擎(测试DSN1)
>;>;引擎工厂2=引擎(测试DSN2)
我们需要在两个新引擎中设置数据库:
>;>;基元数据。创建全部(引擎工厂1())
>;>;基元数据。创建全部(引擎工厂2())
现在创建两个站点,每个站点都将连接到另一个
引擎::
>>;>;site1=dummysite(id=1)
>;>;site2=dummysite(id=2)
我们为每个站点设置本地引擎工厂:
>;>;sm1=site1.getsitemanager()
>;>;sm1.registerUtility(engine戋factory1,provided=ienginefactory)
>;>sm2=site2.getsitemanager()
>;>sm2.registerUtility(engine戋factory2,provided=ienginefactory)
>;component.provideUtility(none,provides=ienginefactory)
/>当我们将其设置为"site2"时,我们将得到engine factory 2::
>;>set site(site2)
>;>component.get utility(ienginefactory)是engine factory2
true
ITY(iscopedsession)是效用
真
>;>;setsite(site1)
>;>;session=session()
ow::
>;>;session.add(user(name='bob'))
>;>;transaction.commit()
``bob``现在已经存在::
>;>;session=session()
>;>;session.query(user).all()[0].name='bob'
true
>>>setsite(site2)
如果我们现在创建一个新会话,我们现在应该使用一个
不同的数据库,该数据库应该仍然是空的:
>;>;session=session()
>;>;session.query(user).a ll()
[]
:
>;>;session.add(user(name='fred'))
>;>;transaction.commit()
>现在"fred"确实存在:
>;>;session=session()
>;>;users=session.query(user).all()
>;>;len(users)
1
>;>;users[0].name=="fred"
true
且"bob"仍在"site1"中:
>;>;setsite(site1)
>;>;session=session()
>;>;users=session.query(user).all()
>;>;len(users)
1
>;>;users[0].name="bob"
true
引擎和线程
==
==
>;>;引擎=无
>;>;def setengine():
…全局引擎
…引擎=引擎工厂1()
t>;engine=none
>;>t=线程。线程(target=setengine)
>;>t.start()
>;>t.join()
>;>engine是引擎工厂1()
true
发动机是发动机工厂1()
false
=======
>提供了一个配置指令,用于使用zcml注册数据库引擎
工厂。
>;>从IO导入bytesio
>;>从zope.configuration导入xmlconfig
>;>导入z3c.saconfig
>;>xmlconfig.xmlconfig('meta.zcml',z3c.saconfig)()
让我们再次尝试注册目录。
>;>;xmlconfig.xmlconfig(bytesio(b""
…<;configure xmlns="http://namespaces.zope.org/db">;
…<;engine name="dummy"url="sqlite:///:内存:"/>;
…<;/configure>;"")
>;>component.getutility(ienginefactory,name="dummy")
<;z3c.saconfig.utility.enginefactory对象位于…>;
这一次是通过一个设置调用。
>;xmlconfig.xmlconfig(bytesio(b""
…<;configure xmlns="http://namespaces.zope.org/db">;
…<;engine name="dummy2"url="sqlite:///:内存:"
…setup="z3c.saconfig.tests.engine_subscriber"/>;
…<;/configure")
got:engine(sqlite:///:memory:)
还可以指定连接池选项:
>;>xmlconfig.xmlconfig(bytesio(b)"
…<;configure xmlns="http://namespaces.zope.org/db">;
…<;engine name="dummy"url="sqlite:///:内存:"
…池大小="1"
…max_overflow="2"
…pool_recycle="3"
…pool_timeout="4"
…/>;
…<;/configure>;"")
>;>;enginefactory=component.getutility(ienginefactory,name="dummy")
>;>;enginefactory.{u kw={convert_unicode':false,'echo':none,'pool_size':1,'max_overflow':2,'pool_recycle':3,'pool_timeout':4}
true
有关连接池的qalchemy文档,了解如何使用这些参数的详细信息。)
提供session指令来注册作用域会话实用程序:
>;>xmlconfig.xmlconfig(bytesio(b""
…<;configure xmlns="http://namespaces.zope.org/db">;
…<;session name="dummy"engine="dummy2"/>;
…<;/configure>;"")
>;>component.getutility(iscopedsession,name="dummy")
<;z3c.saconfig.utility.globallyscopedsession object at…>;
>;>任人唯亲,name="dummy2")
>gt>gt>gt>gt>gt;session=named_scoped_session('dumm')
>gt>gt>gt>gt>gt>gt>gt>gt>gt;session().bind is factory()
true
<0.15(2018-11-30)saconfig
<0.15(2018-11-30)0.15(2018-11-30)0.15(2018-11-11-30)0.15(2018-br/>
======
==========
-fix:`Pithon3兼容性问题,Zope界面实现问题,<;https://github.com/zopefoundation/z3c.saconfig/issues/4>;`[NazrrulWorld]
>0.14(2015-06-29)
===========br/>
>-放弃对sqlalchemy的支持<;0.5
[oggers]
<0.13(2011-07-26)(2011-07-2011-07-26)是的
===
-使用zcml操作注册引擎工厂设置
>0.12(2010-09-28)
==
-enginecreatedevent还将"engine_args"和"engine_kw"作为
属性,以便事件处理程序可以潜在地区分
发动机s.
0.11(2010-07-05)
==
-在
<;engine/>;指令中添加pool_size、max_overflow、pool_recycle和pool_timeout选项。这允许在zcml中定义连接池选项
。
-与sqlalchemy>;=0.5一起使用(与sqlalchemy>;5 previor一起使用)
<0.10(2010-01-18)
====
-支持当前ztk代码
-engine.echo对于sqlal必须默认为nonechemy to荣誉
logging.getlogger("sqlalchemy.engine").setlevel(…)
-默认情况下不启用convert_unicode。此选项通过使字符串类型列返回unicode数据来更改标准的sqlalchemy行为。在ZOPE2环境中,这一点尤其令人痛苦
在ZCML引擎语句中添加convert_unicode选项,允许需要convert_unicode来启用它的用户
<0.9.1(2009-08-14)
=关于PYPI的UDE文档。
-小文档调整。
>0.9(2009-08-14)
===
-首次公开发布。