之前看到了Sails.js的waterline提供了声明式的关系型对象与DB的映射器,惊为天人,可以说是极大地提升了效率。

利用waterline的对象关系模型,用户可以直接使用javascript语言定义关系型的数据库,也就是说,我们不再需要像在java环境中那样声明一个个model,然后具体的关系操作还需要用户在业务逻辑中代码处理,而是提供了关系型的申明方式来创建model,支持one way relation, one-one relation, one-many relation, many-many relation。其语法如下:

one way relation:

#myApp/api/models/pet.js
module.exports = { attributes: {
name:'STRING',
color:'STRING'
} }
#myApp/api/models/user.js
module.exports = { attributes: {
name:'STRING',
age:'INTEGER',
pony:{
model: 'pet'
}
} }

one-many relation:

#myApp/api/models/pet.js
module.exports = { attributes: {
name:'STRING',
color:'STRING',
owner:{
model:'user'
}
} } #myApp/api/models/user.js
module.exports = { attributes: {
name:'STRING',
age:'INTEGER',
pets:{
collection: 'pet',
via: 'owner'
}
} }

还有 many-many relation:

#myApp/api/models/pet.js
module.exports = { attributes: {
name:'STRING',
color:'STRING', // Add a reference to User
owners: {
collection: 'user',
via: 'pets',
dominant:true
}
}
}
#myApp/api/models/user.js
module.exports = { attributes: {
name:'STRING',
age:'INTEGER', // Add a reference to Pet
pets:{
collection: 'pet',
via: 'owners'
}
} }

可以看到,所有的数据库关系都通过了对象model定义好了,同时还支持流水线式(waterline)的操作方式:

User.find().populate('pets').exec(function(err,r){console.log(r[0].toJSON())});
//以下为返回的json
{ pets:
[ { name: 'Pinkie Pie',
color: 'pink',
id: 2,
createdAt: Tue Feb 11 2014 17:58:04 GMT-0600 (CST),
updatedAt: Tue Feb 11 2014 17:58:04 GMT-0600 (CST),
owner: 1 },
{ name: 'Applejack',
color: 'orange',
id: 4,
createdAt: Tue Feb 11 2014 18:02:58 GMT-0600 (CST),
updatedAt: Tue Feb 11 2014 18:02:58 GMT-0600 (CST),
owner: 1 } ],
name: 'Mike',
age: 21,
createdAt: Tue Feb 11 2014 17:49:04 GMT-0600 (CST),
updatedAt: Tue Feb 11 2014 17:49:04 GMT-0600 (CST),
id: 1 }

眼见着javascript生态环境一片欣欣向荣,不得不感叹我大python却无如此激情洋溢的框架,不禁扼腕。于是打算自己开创一个,却由于水平和时间所限,至今任然没开始动工,只是开了个repo在github。

今天偶然发现了一个python的package,名叫Pony,其功能与waterline相当,而且整个生态环境更加友好,还提供了UI工具供开发者使用。

参考:

1. Pony ORM官网:http://ponyorm.com/

2. Pony Demo:  http://www.blog.pythonlibrary.org/2014/07/21/python-101-an-intro-to-pony-orm/

3. Pony github: https://github.com/ponyorm/pony

4. Pony Docs: http://doc.ponyorm.com/

5. Pony Editor: https://editor.ponyorm.com/

python下申明式的对象关系DB映射器--Pony的更多相关文章

  1. [Python之路] ORM(对象关系映射)

    一.概念 ORM是Python后端Web框架Django的核心思想,"Object Relational Mapping",即对象-关系映射,简称ORM. 一句话理解就是: 创建一 ...

  2. 对象-关系Metadata映射模式

    MetaData Mapping元数据映射 在MetaData中保存object-relation映射的详细信息. 以表格形式定义映射,并可由通用代码来处理映射. 运行机制 MetaData中的信息如 ...

  3. spring_配置处理器对象、处理器映射器、处理器适配器、视图解析器

    创建spring配置文件:application-context.xml. 创建处理器类 package com.lanou.demo.controller;public class BookCont ...

  4. Hibernate单向多对一对象关系模型映射

    单向的many-to-one 案例: 班级和学生 父亲和子女 单向:只能由其中一方维护关系 Many-to-one中有many的一方法维护或者体现两者之间的关系. 单向的many-to-one描述学生 ...

  5. Hibernate双向一对一对象关系模型映射

    一个员工一辆车:one-to-one 实现一:让汽车表中的外键唯一 create table emp ( eid int primary key auto_increment, ename varch ...

  6. .net AutoMapper(对象与对象之间的映射器) 的简单使用

    1.注册 /// <summary>    /// AutoMapper 注册    /// </summary>    public class AutoMapperConf ...

  7. Java 自定义注解实现ORM对象关系映射

    一,ORM概念 ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关 ...

  8. Python学习---django之ORM语法[对象关系映射]180124

    ORM语法[对象关系映射] ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作. 优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句.快速开发. 2 ...

  9. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

随机推荐

  1. vue2.0路由

    现在用vue-cli搭建的环境里面vue-router是下载好的 vue2.0路由方式和以前也有些不同 没了了map和start方法 目录结构如上图 这里有三个文件,app.vue显示,main.js ...

  2. JdbcType类型和Java类型的对应关系

    在Oracle中有些字段不是必填时在用户使用的时候会出现数据null的情况.这个时候在Oracle中是无法进行插入的. JDBC Type Java Type CHAR String VARCHAR ...

  3. 【noip模拟赛7】上网 线性dp

    描述 假设有n个人要上网,却只有1台电脑可以上网.上网的时间是从1 szw 至 T szw ,szw是sxc,zsx,wl自创的时间单位,至于 szw怎么换算成s,min或h,没有人清楚.依次给出每个 ...

  4. 使用PhoneGap搭建一个山寨京东APP(转)

      为什么要写一个App 首先解释下写出来的这个App,其实无任何功能,只是用HTML和CSS模仿JD移动端界面写的一个适配移动端的Web界面.本篇主要内容是介绍如何使用PhoneGap把开发出来的m ...

  5. 移动端H5页面返回并且刷新页面(BFcache)

    项目中的需求:点击浏览器中的返回按钮,要让页面重新加载资源.因为这部分的资源每次去加载的内容都不一样,如果返回的时候,还是看到原先的内容,那做这个内容块的意义就很小了:而如果用户看完了这部分内容,再返 ...

  6. IdentityServer4-前后端分离的授权验证(六)

    上两节介绍完Hybrid模式在MVC下的使用,包括验证从数据获取的User和Claim对MVC的身份授权.本节将介绍Implicit模式在JavaScript应用程序中的使用,使用Node.js+Ex ...

  7. odoo 模型继承

    在odoo中有两种模型的继承机制(传统方式和委托继承方式) 重点:在__manifest__.py中找到depends,加上要继承的模块 'depends': ['account'] 注意继承的模型所 ...

  8. 说出ArrayList,Vector, LinkedList的存储性能和特性

     ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插 ...

  9. Django之路12——form modelform formset modelformset的各种用法

      首先上结论: form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义. modelform:适用于对用户提交的单个表单操作,字段可以用model中的表的字段来作为验证规则,适用于快速的 ...

  10. 洛谷.4717.[模板]快速沃尔什变换(FWT)

    题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype&g ...