基于sqlalchemy的rdb对grok的支持。
megrok.rdb的Python项目详细描述
megrok.rdb
简介
megrok.rdb 包添加了强大的关系数据库支持 grok,基于强大的sqlalchemy库。它提供 新的megrok.rdb.model和megrok.rdb.container 很像Core Grok中的那些,但是有一个关系 数据库。
在本文档中,我们将向您展示如何使用 megrok.rdb
声明性模型
megrok.rdb 使用sqlalchemy的orm系统,特别是 声明性扩展,几乎是直接的。 megrok.rdb 只需提供 很少有特殊的基类和指令使事情变得更简单,还有一些 有助于与Grok集成的其他便利设施。
我们首先导入稍后需要的sqlalchemy位:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation
sqlalchemy将数据库架构信息分组到一个名为 元数据 。架构可以从数据库架构反映出来,或者 可以从python中定义的模式创建。我们 通常从内容类中执行后者 映射到使用orm。我们需要一些元数据来关联 我们的内容课程。
让我们设置元数据对象:
>>> from megrok import rdb >>> metadata = rdb.MetaData()
现在我们将建立一些内容类。我们会有一个非常简单的 (大学)系零门或多门课程的结构 与之相关。首先,我们将定义一个可以包含 课程:
>>> class Courses(rdb.Container): ... pass
就这些。如果未使用 rdb.key 指令,则 容器将被定义为(可能是自动分配的) 数据库中的主键。
修理一个使事情在博士工作的黑客。在某些特定的设置中 这次黑客攻击已经不需要了,但我现在不能 重新建立包的组合:
>>> __file__ = 'foo'
现在我们可以设置 部门 类。这有 课程 链接到其课程的关系:
>>> class Department(rdb.Model): ... rdb.metadata(metadata) ... ... id = Column('id', Integer, primary_key=True) ... name = Column('name', String(50)) ... ... courses = relation('Course', ... backref='department', ... collection_class=Courses)
这和你使用 sqlalchemy.ext.declarative ,但有一些不同:
* we inherit from ``rdb.Model`` to make this behave like a Grok model.
-
我们不需要使用
\u table name\uuu 来设置表名。通过 默认情况下,表名将是类名,小写,但是 可以通过使用 rdb.tablename 指令来覆盖它。 - 我们需要明确使用的元数据对象。我们做 在测试中,尽管在grok应用程序中使用它已经足够了 模块级上的 rdb.metadata 指令包含所有rdb 自动与该元数据对象关联的类。
- 我们标记 courses 关系使用 courses 容器 我们以前定义过的类。这是一个普通的sqlalchemy特性, 如果我们想使用Grok样式的容器,就必须使用它。
我们通过定义 课程来完成数据库定义。 类别:
>>> class Course(rdb.Model): ... rdb.metadata(metadata) ... ... id = Column('id', Integer, primary_key=True) ... department_id = Column('department_id', Integer, ... ForeignKey('department.id')) ... name = Column('name', String(50))
我们在这里看到 课程 链接到它所在的部门, 使用外键。
配置
我们需要真正地摸索这些物体,让它们完全固定 起来。通常grok会自动处理这个问题,但在这种情况下 我们需要手动操作。
首先,我们浏览这个包裹的浏览者:
>>> import grokcore.component.testing >>> grokcore.component.testing.grok('megrok.rdb.meta')
现在我们可以摸索组件:
>>> from grokcore.component.testing import grok_component >>> grok_component('Courses', Courses) True >>> grok_component('Department', Department) True >>> grok_component('Course', Course) True
一旦我们定义了元数据和对象关系映射,我们就需要 要有一个数据库来把这些放进去。尽管有可能 为每个grok应用程序设置不同的数据库,这里我们将使用 单个全局数据库:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation0
我们需要向发动机厂提供公用事业。格罗克可以做到 使用模块级的grok.global_实用程序自动执行 指令,如下:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation1
在测试中,我们将直接使用组件体系结构:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation2
既然我们已经让你作为引擎,我们可以设置sqlalchemy会话 效用:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation3
对于grok,我们会这样注册:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation4
不过,我们还是直接注册它进行测试:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation5
我们现在需要创建在数据库中定义的表。我们能做到 只有在首次创建引擎时,我们才会为其设置处理程序:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation6
使用数据库
现在,我们可以使用 rdb.session 对象 与数据库的连接。
< Buff行情>>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation7
现在让我们创建一个数据库结构。我们有一个哲学系:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation8
我们需要手动将其添加到数据库中,因为我们没有定义 我们数据库中的特定容器:
>>> from sqlalchemy import Column, ForeignKey >>> from sqlalchemy.types import Integer, String >>> from sqlalchemy.orm import relation9
哲学系有许多课程:
>>> from megrok import rdb >>> metadata = rdb.MetaData()0
我们会把它们加到哲学系的课程容器里。自从 我们想把钥匙留给数据库,我们会 使用特殊的 set 方法,容器对象必须 添加对象:
>>> from megrok import rdb >>> metadata = rdb.MetaData()1
我们现在可以验证课程是否存在:
>>> from megrok import rdb >>> metadata = rdb.MetaData()2
如您所见,自动生成的主键也被使用 现在作为容器密钥。
容器的键总是整数,即使我们正在处理 主键:
>>> from megrok import rdb >>> metadata = rdb.MetaData()3
带有rdb.key的自定义键
现在我们设置一个不同的属性来用作容器键。 我们将使用课程的 名称 属性。
我们将再次设置数据模型,这次使用 课程 课程:
>>> from megrok import rdb >>> metadata = rdb.MetaData()4
我们探索这些新课程:
>>> from megrok import rdb >>> metadata = rdb.MetaData()5
我们不需要更改引擎,因为 数据库保持不变。我们再成立一个学院 部门:
>>> from megrok import rdb >>> metadata = rdb.MetaData()6
我们现在将这些系添加到物理系:
>>> from megrok import rdb >>> metadata = rdb.MetaData()7
我们现在可以验证课程是否在那里,并将名称作为键:
>>> from megrok import rdb >>> metadata = rdb.MetaData()8
自定义查询容器
有时我们希望将对象公开为基于(只读)容器的 一个查询,而不是一个关系。这在构造 应用程序需要一个"起点",一个根对象 启动到本身不是直接的sqlalchemy映射对象 由sqlalchemy管理。
我们可以通过从 rdb.querycontainer 子类化并实现 特殊的查询方法:
>>> from megrok import rdb >>> metadata = rdb.MetaData()9
让我们尝试一些常见的只读容器操作,例如 获取项目 :
>>> class Courses(rdb.Container): ... pass0
为什么你的"哲学"和"物理学"之间的Unicode差异?
键错误的获取项目 :
>>> class Courses(rdb.Container): ... pass1
获取 :
>>> class Courses(rdb.Container): ... pass2
含有
>>> class Courses(rdb.Container): ... pass3
有u键 :
>>> class Courses(rdb.Container): ... pass4
长度:
>>> class Courses(rdb.Container): ... pass5
值 :
>>> class Courses(rdb.Container): ... pass6
所有值的父级都是查询容器:
>>> class Courses(rdb.Container): ... pass7
键 :
>>> class Courses(rdb.Container): ... pass8
项目 :
>>> class Courses(rdb.Container): ... pass9
>项目:
>>> __file__ = 'foo'0
正在转换QueryContainer的结果
有时转换(或修改)查询的输出是有用的 在它们出现在容器里之前。你可以实现 要这样做, convert 方法。它将得到的单个值 并应返回转换后的值:
>>> __file__ = 'foo'1
现在让我们检查所有值是否都是 特殊部分 :
>>> __file__ = 'foo'2
keyerror仍然有效:
>>> class Courses(rdb.Container): ... pass1
获取 :
>>> __file__ = 'foo'4
值 :
>>> __file__ = 'foo'5
所有值的父级都是查询容器:
>>> class Courses(rdb.Container): ... pass7
项目 :
>>> __file__ = 'foo'7
进一步自定义QueryContainer
有时它是有用的o定义自定义keyfunc和自定义方法 从数据库中检索密钥-这些通常是实现的 一起:
>>> __file__ = 'foo'8