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

我们需要向发动机厂提供公用事业。格罗克可以做到 使用模块级的grok.global_实用程序自动执行 指令,如下:

>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
1

在测试中,我们将直接使用组件体系结构:

>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
2

既然我们已经让你作为引擎,我们可以设置sqlalchemy会话 效用:

>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
3

对于grok,我们会这样注册:

>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
4

不过,我们还是直接注册它进行测试:

>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
5

我们现在需要创建在数据库中定义的表。我们能做到 只有在首次创建引擎时,我们才会为其设置处理程序:

>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
6

使用数据库

现在,我们可以使用 rdb.session 对象 与数据库的连接。

< Buff行情>
>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
7

现在让我们创建一个数据库结构。我们有一个哲学系:

>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
8

我们需要手动将其添加到数据库中,因为我们没有定义 我们数据库中的特定容器:

>>> from sqlalchemy import Column, ForeignKey
>>> from sqlalchemy.types import Integer, String
>>> from sqlalchemy.orm import relation
9

哲学系有许多课程:

>>> 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):
...    pass
0

为什么你的"哲学"和"物理学"之间的Unicode差异?

键错误的获取项目

>>> class Courses(rdb.Container):
...    pass
1

获取

>>> class Courses(rdb.Container):
...    pass
2

含有

>>> class Courses(rdb.Container):
...    pass
3

有u键

>>> class Courses(rdb.Container):
...    pass
4

长度:

>>> class Courses(rdb.Container):
...    pass
5

>>> class Courses(rdb.Container):
...    pass
6

所有值的父级都是查询容器:

>>> class Courses(rdb.Container):
...    pass
7

>>> class Courses(rdb.Container):
...    pass
8

项目

>>> class Courses(rdb.Container):
...    pass
9

>项目:

>>> __file__ = 'foo'
0

正在转换QueryContainer的结果

有时转换(或修改)查询的输出是有用的 在它们出现在容器里之前。你可以实现 要这样做, convert 方法。它将得到的单个值 并应返回转换后的值:

>>> __file__ = 'foo'
1

现在让我们检查所有值是否都是 特殊部分

>>> __file__ = 'foo'
2

keyerror仍然有效:

>>> class Courses(rdb.Container):
...    pass
1

获取

>>> __file__ = 'foo'
4

>>> __file__ = 'foo'
5

所有值的父级都是查询容器:

>>> class Courses(rdb.Container):
...    pass
7

项目

>>> __file__ = 'foo'
7

进一步自定义QueryContainer

有时它是有用的o定义自定义keyfunc和自定义方法 从数据库中检索密钥-这些通常是实现的 一起:

>>> __file__ = 'foo'
8

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

推荐PyPI第三方库


热门话题
具有未知数量条件的java If语句   java如何在Spark中使用两个“条件”进行过滤?   雅加达ee为ColdFusion提供的最佳Java ee服务器   java如何在jersey的MessageBodyWriter方法中获取writeTo中的anotations值?   java从脚本文件调用jar文件中的函数   java在执行insert语句后,如何获得id值为的语句?   在OS X上设置OpenCV Java绑定   java使用for循环遍历数组x。以字符串形式返回x的元素,其中每个元素由一个空格分隔   ApacheiClientBuilder为Algolia Java创建的APIClient是线程安全的吗?   java在DFS/BFS算法中获取邻居时避免内存分配?   java使用AES/CBC/PKCS5P加密大文件(2GB)   允许保存/加载列布局的Java DB网格组件   队列大小为1的java Spring调度   跑步带有Java参数的exe   java正则表达式将所有“<”和“>”标记替换为“&lt;”及“&gt;”在<<![CDATA]>标签?   java何时同步变量?