现在的位置: 主页 > 企业简介 > 文章正文

elixir的关系定义

作者:陕西芙爱尔婚庆礼仪服务有限公司 来源:www.fair521.com 未知发布时间:2017-09-08 18:24:05
elixir的关系定义 elixir的版本为0.7.1,依赖的sqlalchemy版本为0.7.8,转载请注明出处。

Elixir是基于python界有名的ORM库SQLAlchemy做的封装。而且是轻量级的封装,它提供了更简单的方式来创建Python类并直接映射到关系数据库表(即通常所说的Active Record设计模式),类似于Django中的ORM。

下面为relationships.py源码中对四种关系的说明。

这个模块为在Elixir的实体之间定义映射关系提供支持。Elixir目前提供两种语法来定义关系:

默认的是使用基于属性的语法,它提供有如下几种关系:

ManyToOne, OneToMany, OneToOne and ManyToMany

另外一种就是基于领域特定语言(Domain Specific Language)的语法,相应提供有如下几种关系:

belongs_to, has_many, has_one and has_and_belongs_to_many

======================

基于属性的语法

======================

这些负责建立关系映射的方法接受的第一个参数,是需要被关系到的实体类(entity class)的类名。

在这个强制参数之后,其他参数都用来描述一些特定高级行为,这可以通过查看每个关系类型的特定关键参数列表来了解。在这里需要指出的是,所有在下面文档里提到的那些不是专门由Elixir负责处理的参数都将被传递给SQLAlchemy的relation函数处理,请查看SQLAlchemy的SQLAlchemy的relation函数的文档,以了解更多这些参数的详细内容<http://www.sqlalchemy.org/docs/05/reference/orm/mapping.html#sqlalchemy.orm.relation>。

记住下面这些参数是Elixir自动生成的,在你没必要重定义Elixir提供的这些参数的值的时候,切记不要使用这些参数:

`uselist`,`remote_side`, `secondary`, `primaryjoin` and `secondaryjoin`

另外,你在定义一个双向关系的时候,你必须在另外那个实体明确定义一个反向关系(inverse),这正好与SQLAlchemy的backrefs的定义方式不同。在没有歧义的情况下,Elixir将自动匹配实体之间定义的关系。但如果同一类型多个的关系在两个实体分别都作定义,那么Elixir将无法确定那个关系是关系反向的一方。所以,你需要为另外那个实体中定义的关系的inverse参数提供被反向的关系名,以明确一个反向关系。

下面是每种关系的详解:

`ManyToOne`

-----------

在子实体的一边,描述一个有多个子实体的父子关系(parent-child relationship)。

比如,描述某个Pet类实体的所有者是一个Person类实体,那么可以表达为:

[python] view plaincopyprint?

class Pet(Entity):

owner = ManyToOne('Person')

在这里,我们背后假设了Person实体的主键是一个叫`id`的整型列,那么定义的ManyToOne关系将会在Pet实体的中自动添加一个名为`owner_id`的整型列。

此外,除了从SQLAlchemy的relation函数关键字继承的参数,ManyToOne关系还支持下面这些可选参数,他们将指导新列的创建过程:

可选参数名

描述

``colname``

为外键列指定一个自定名称。

这个参数接受一个字符串或者一个字符串列表,字符串表的字符数必须与被关联到的实体的主键的列数相等。

如果没有使用这个参数,那么新建的外键列的名称的将采用在options.FKCOL_NAMEFORMAT中定义的默认方式,形式为:"%(relname)s_%(key)s",这里的'relname'是实体所定义的ManyToOne关系字段的名称,'key'是被关联到的目标实体的主键列的名称。因此,在上面的例子中,外键列的名称当然就是"owner_id"。

``required``

指定这个字段是否可以为空(即不给定该列的值),除非为所在实体的主键,一般默认值为`False`。

``primary_key``

指定该关系所创建的列是否作为所在实体的主键列。

``column_kwargs``

保存一个需要传递给列的其它参数名及其值的字典。

``target_column``

指定被关联到的目标实体中的作为该关系所在实体的外键的列。

默认使用被关联到的实体的主键列。

下面的可选参数用于自定义所创建的外键约束(ForeignKeyConstraint):

可选参数名

描述

``use_alter``

如果为True,sqlalchemy将会在第二个SQL语句中添加这个约束(这与创建表的语句不同),这允许在表间定义一个环状外键依赖关系。

``ondelete``

外键约束ondelete条款。

可以是以下之一: `cascade`, `restrict`, `set null`或者`set default`。

``onupdate``

外键约束onupdate条款。

可以是以下之一: `cascade`, `restrict`, `set null`或者`set default`。

``column_kwargs``

一个保存有其余需要传递给约束的参数名及其值的字典。

在某些时候,你可能想要明确地声明外键列,而不是自动生成,可能的原因如:你想要精确的声明外键列的相关参数,以及使用column_kwargs参数使你的代码变得有些丑,或者因为你的外键列名与你的属性名相冲突(这种情况会抛出一个异常)。这时,你可以使用`field`参数来指定一个已经声明的字段来作为外键。比如:

[python]

class Pet(Entity):

owner_id = Field(Integer, colname='owner')

owner = ManyToOne('Person', field=owner_id)

可选参数名

描述

``field``

指定一个预先声明的字段来作为外键列,这个参数与colname、column_kwargs不要同时使用。

此外,Elixir支持使用belongs_to语句来代替ManyToOne,这是一个基于DSL的语法形式而已。

`OneToMany`

-----------

在父实体的一边,描述一个有多个子实体的父子关系(parent-child relationship)。

比如,如果要描述一个Person类实体有多个children类实体,而每一个children类实体又都是一个Person类实体,可以表达如下:

[python]

class Person(Entity):

parent = ManyToOne('Person')

children = OneToMany('Person')

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉SEO http://wuhan.4567w.com

上一篇:Asp.net MVC 多语言应用 下一篇:最后一页