基于sqlalchemy的应用程序的cromlech web框架实用程序方法和组件。
cromlech.sqlalchem的Python项目详细描述
cromlech.sqlalchemy
###################
``cromlech.sqlalchemy`` provides utility functions and components to ease
the use of `SQLAlchemy`.
Test setup
===========
We get a temporary dir to place our databases::
>>> import tempfile
>;>>工作目录=tempfile.mkdtemp('cromlech-sqlalchemy-test')
配置和注册
======
>>;>;从cromlech.sqlalchemy导入创建引擎
>;>;用户数据库='sqlite://%s/users.db'%工作目录
>;>;存储数据库='sqlite://%s/store.db'%工作目录
>;>;用户引擎=创建引擎(用户数据库,'users')
>;>;存储引擎=创建引擎(存储数据库,'store')
model
=
>让我们使用声明性扩展:
>;>;来自sqlalchemy.ext.declarative import declarative\u base
>;>;userbase=declarative\u base()
>;>;users_engine.bind(userbase)
在sqlalchemy中,您将声明数据库绑定到的wich engine。在我们的
案例中,url将与第一个连接一起出现在environ中,因此我们将
这一点定义为创建引擎的时刻。该包提供了一种方法
为此:
>我们可以从sqlalchemy import column,integer,string
>gt;类用户(userbase):
…_ tablename"测试用户"
…
…id=列('id',integer,primary_key=true)
…name=列('name',string(50))
…
…定义代表(自我):
…返回"user"(%d,%s')"%(self.id,self.name)
controller
==
>执行任何操作,我们将使用sqlalchemysession context manager
提供引擎名称::
>;>;来自cromlech.sqlalchemy import sqlalchemysession,get_session
通常,第一个请求可能会创建我们的表:
>;,其中sqlalchemysession(users_engine)作为会话:
…userbase.metadata.create_all()
…print session.query(user).all()
[]
这在代码中的任何位置都很方便,例如选项:
>;>def add_user(id,name):
…会话=获取会话("用户")
…session.add(user(id=id,name=name))
>添加用户(1,"bob")
…print session.query(user).all()
[用户(1,'bob')]
==
>对于本章,假设我们在with sqlalchemysession子句中::
>;>;ctxmanager=sqlalchemysession(用户引擎)
>;>;session=ctxmanager.\uu enter_uuu()
事务使用zope.sqlalchemy链接到zope事务,上面的所有操作都尚未提交。让我们中止以查看bob不再存在:
>;>transaction.abort()
>;>print session.query(user).all()
[]
>现在再次添加一个提交,这样就可以了:
>;>transaction.commit()
>;>添加用户(1,"bob")
>;>transaction.commit()
>;>print session.query(user.all()
[user(1,"bob")]
>现在我们真的进入了一个新的事务:
>;>transaction.abort()
>;print session.query(user).all()
[用户(1,'bob')]
现在让我们结束我们的会话:
>>>;ctxmanager.\uu exit(none,none,无)
不止一个数据库
====
存储引擎。绑定(storebase)
_ tablename"测试产品"
…id=列('id',integer,primary_key=true)
…name=列('name',string(50))
…
…定义代表(自我):
…返回"产品"(%d,%s')"%(self.id,self.name)
使用sqlalchemysession(存储引擎)作为会话:
…storebase.metadata.create_all()
会话=获取会话('store')
…session.add(product(id=id,name=name))
使用sqlalchemysession(存储引擎)作为会话:
…使用sqlalchemysession(用户引擎)作为会话:
…添加用户(2,"juan")
…添加"产品"(1,"表")
它可以工作:
>;>;使用sqlalchemysession(用户引擎)作为会话:
…session.query(user).all()
[用户(1,'bob'),用户(2,'juan')]
>;>;使用sqlalchemysession(存储引擎)作为会话:
…session.query(product).all()
[产品(1,'表')]
多个元数据
====
现在我们还可以将另一个元数据绑定到同一个数据库,这项工作
,即使它已经初始化::
>;group base=declarative懔base()
>>>用户懔引擎。绑定(groupbase)
>>>类组(groupbase):
…_ tablename"测试组"
…id=列('id',integer,primary_key=true)
…name=列('name',string(50))
…
…定义代表(自我):
…返回"group"(%d,%s')"%(self.id,self.name)
>;,事务管理器:
…使用sqlalchemysession(用户引擎)作为会话:
…groupbase.metadata.create_all()
…session.add(组(id=1,name='them'))
…session.query(group).all()
[组(1,'them')]
unique session
==
>只要您知道应用程序总是将同一数据库名与同一数据库名关联,您就可以设置一次会话,并且只设置一次,从而消除了单个请求的开销。为此,请使用sharedSqlAlchemySession上下文管理器。
请注意,它仍然是一个作用域会话(线程之间没有共享),而且您不必关心何时初始化它,只需使用上下文管理器即可:从cromlech.sqlalchemy导入sharedSqlAlchemySession
>;>;并将sharedSqlAlchemySession(存储引擎)作为会话:
…会话=会话
…session.query(product).all()
[产品(1,"表")]
会话将被重用:
>;,其中sharedSqlCalchemySession(存储引擎)作为会话:
…打印会话是指到阶段或非两阶段的真正会话
如果不通过,mysql和postgre(已知的支持数据库)的两个阶段将设置为true,否则设置为false。
:
…使用sqlalchemysession(store_engine,two_phase=true):
…添加产品(10,"chair")
回溯(最近一次调用):
…
值错误:SQL引擎"store":"sqlite"不支持两阶段提交
,因为sqlite不支持!
更改日志
==
>0.4(2017-03-18)
----
-我们不再使用ZCA注册引擎。这将通过删除"create_and_register"函数向后打破
兼容性。
>0.3(2012-04-29)
----
-主要更改:我们不再支持延迟绑定。上下文
管理者现在直接使用引擎,它现在是一个"engine"对象。
这使得实现变得更加简单。
<0.2(2012-01-26)
----
-py2.7的固定测试取决于环境。
这允许我们在wsgi堆栈之外使用此包。
<0.1a1
----
-初始版本
###################
``cromlech.sqlalchemy`` provides utility functions and components to ease
the use of `SQLAlchemy`.
Test setup
===========
We get a temporary dir to place our databases::
>>> import tempfile
>;>>工作目录=tempfile.mkdtemp('cromlech-sqlalchemy-test')
配置和注册
======
>>;>;从cromlech.sqlalchemy导入创建引擎
>;>;用户数据库='sqlite://%s/users.db'%工作目录
>;>;存储数据库='sqlite://%s/store.db'%工作目录
>;>;用户引擎=创建引擎(用户数据库,'users')
>;>;存储引擎=创建引擎(存储数据库,'store')
model
=
>让我们使用声明性扩展:
>;>;来自sqlalchemy.ext.declarative import declarative\u base
>;>;userbase=declarative\u base()
>;>;users_engine.bind(userbase)
在sqlalchemy中,您将声明数据库绑定到的wich engine。在我们的
案例中,url将与第一个连接一起出现在environ中,因此我们将
这一点定义为创建引擎的时刻。该包提供了一种方法
为此:
>我们可以从sqlalchemy import column,integer,string
>gt;类用户(userbase):
…_ tablename"测试用户"
…
…id=列('id',integer,primary_key=true)
…name=列('name',string(50))
…
…定义代表(自我):
…返回"user"(%d,%s')"%(self.id,self.name)
controller
==
>执行任何操作,我们将使用sqlalchemysession context manager
提供引擎名称::
>;>;来自cromlech.sqlalchemy import sqlalchemysession,get_session
通常,第一个请求可能会创建我们的表:
>;,其中sqlalchemysession(users_engine)作为会话:
…userbase.metadata.create_all()
…print session.query(user).all()
[]
这在代码中的任何位置都很方便,例如选项:
>;>def add_user(id,name):
…会话=获取会话("用户")
…session.add(user(id=id,name=name))
>添加用户(1,"bob")
…print session.query(user).all()
[用户(1,'bob')]
>对于本章,假设我们在with sqlalchemysession子句中::
>;>;ctxmanager=sqlalchemysession(用户引擎)
>;>;session=ctxmanager.\uu enter_uuu()
事务使用zope.sqlalchemy链接到zope事务,上面的所有操作都尚未提交。让我们中止以查看bob不再存在:
>;>transaction.abort()
>;>print session.query(user).all()
[]
>现在再次添加一个提交,这样就可以了:
>;>transaction.commit()
>;>添加用户(1,"bob")
>;>transaction.commit()
>;>print session.query(user.all()
[user(1,"bob")]
>现在我们真的进入了一个新的事务:
>;>transaction.abort()
>;print session.query(user).all()
[用户(1,'bob')]
现在让我们结束我们的会话:
>>>;ctxmanager.\uu exit(none,none,无)
不止一个数据库
====
存储引擎。绑定(storebase)
_ tablename"测试产品"
…id=列('id',integer,primary_key=true)
…name=列('name',string(50))
…
…定义代表(自我):
…返回"产品"(%d,%s')"%(self.id,self.name)
使用sqlalchemysession(存储引擎)作为会话:
…storebase.metadata.create_all()
会话=获取会话('store')
…session.add(product(id=id,name=name))
使用sqlalchemysession(存储引擎)作为会话:
…使用sqlalchemysession(用户引擎)作为会话:
…添加用户(2,"juan")
…添加"产品"(1,"表")
它可以工作:
>;>;使用sqlalchemysession(用户引擎)作为会话:
…session.query(user).all()
[用户(1,'bob'),用户(2,'juan')]
>;>;使用sqlalchemysession(存储引擎)作为会话:
…session.query(product).all()
[产品(1,'表')]
多个元数据
====
现在我们还可以将另一个元数据绑定到同一个数据库,这项工作
,即使它已经初始化::
>;group base=declarative懔base()
>>>用户懔引擎。绑定(groupbase)
>>>类组(groupbase):
…_ tablename"测试组"
…id=列('id',integer,primary_key=true)
…name=列('name',string(50))
…
…定义代表(自我):
…返回"group"(%d,%s')"%(self.id,self.name)
>;,事务管理器:
…使用sqlalchemysession(用户引擎)作为会话:
…groupbase.metadata.create_all()
…session.add(组(id=1,name='them'))
…session.query(group).all()
[组(1,'them')]
unique session
==
>只要您知道应用程序总是将同一数据库名与同一数据库名关联,您就可以设置一次会话,并且只设置一次,从而消除了单个请求的开销。为此,请使用sharedSqlAlchemySession上下文管理器。
请注意,它仍然是一个作用域会话(线程之间没有共享),而且您不必关心何时初始化它,只需使用上下文管理器即可:从cromlech.sqlalchemy导入sharedSqlAlchemySession
>;>;并将sharedSqlAlchemySession(存储引擎)作为会话:
…会话=会话
…session.query(product).all()
[产品(1,"表")]
会话将被重用:
>;,其中sharedSqlCalchemySession(存储引擎)作为会话:
…打印会话是指到阶段或非两阶段的真正会话
如果不通过,mysql和postgre(已知的支持数据库)的两个阶段将设置为true,否则设置为false。
:
…使用sqlalchemysession(store_engine,two_phase=true):
…添加产品(10,"chair")
回溯(最近一次调用):
…
值错误:SQL引擎"store":"sqlite"不支持两阶段提交
,因为sqlite不支持!
更改日志
==
>0.4(2017-03-18)
----
-我们不再使用ZCA注册引擎。这将通过删除"create_and_register"函数向后打破
兼容性。
>0.3(2012-04-29)
----
-主要更改:我们不再支持延迟绑定。上下文
管理者现在直接使用引擎,它现在是一个"engine"对象。
这使得实现变得更加简单。
<0.2(2012-01-26)
----
-py2.7的固定测试取决于环境。
这允许我们在wsgi堆栈之外使用此包。
<0.1a1
----
-初始版本