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)
===


-首次公开发布。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何使用java向dropup html/css添加项目   如何从java中的向量向量打印   Java Maven库项目模板   java使用atmosphere api还是直接使用grizzly?   java JComponent仅部分显示   如何将动态值传递给自定义注释,以从Java数据进行映射。性质   java破解已实现方法的返回类型的最佳方法?   java Netbeans在JFrame Gui布局中覆盖图像   spring java仅向登录用户显示注销按钮   java如何对com进行身份验证。谷歌。云bigquery。带有服务帐户的BigQuery`   java禁止空字符串参数和抛出RuntimeException以阻止方法继续的利弊   java分析项目中的所有JAR以获取版本和许可证信息   Java,数据库为什么要分配一个新对象,而我们可以直接将它放入数据库