基于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
----

-初始版本

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

推荐PyPI第三方库


热门话题
SpringWeb中的java更新/通知其他用户   java Lambda性能测试   java Bukkit插件:空白符号   java在按下按钮后改变彩色正方形的大小   javajavac相当于“D”?   java序列化接口   属性无法从属性文件返回值   java我应该使用什么查询来使用Jsoup从html页面提取符号?   java Android Studio项目结构问题   JAVA方法和返回值/公共变量(基础)   java将NativeQuery映射到POJO   java如何在下面的程序中消除NumberFormatException?   在java中获取链表与数组中的对象   java Android Firebase将用户发送到聊天室