sqlalchemy:强大的 sqlalchemy

  sqlalchemy 文档可谓典范谁叫作者还开发着模板语言(myghty、mako)呢呵呵其实 sqlalchemy 文档就是用 myghty 写

  不过系统复杂了功能多了再好文档也会让人迷路最近用了用 sqlalchemy 对这点感受颇深故把临时想到几个比较常用功能摘录如下提纲挈领既为自己整理下思路也让新手窥 sqlalchemy 精华

  Eager Loading

  Join本是关系数据库中多么常见操作怎奈 django orm 就是不支持SQLObject 做法也很不如人意

  Association Object

  many-to-many 关系都是通过增加个中间表来实现映射到对象后这个中间表就不需要我们再操心了会隐式地进行处理

  不过对于多个实体两两的间多对多关系往往另外再增加个关联对象会更方便

  这样例子其实也不少比如:user-bookmark-tags、产品-元件-元件供应商(这是次期末考试题目里面 ;-)

  Deferred Column Loading

  比如文章表里面 body 字段通常比较大在获取文章列表时这个字段就不必取出来了甚至如果你有某个字段存是文件这个功能就更加重要了

  这本是个不起眼小功能不过上次看到 javaeye 中有贴说到大名鼎鼎 Hibernate 都对这个功能实现得这么痛苦后我蓦然发现 sa 真很 nb呵呵托了动态语言福了吧

  Mapping a Class with Table Inheritance

  如何把对象间继承关系映射到关系数据库sqlalchemy 提供 3种方式:

  single table inheritance 所有子类型都放在个表中;

  concrete table inheritance 每种子类型存在独立表中;

  multiple table inheritance 父子类型都存在独立表中查询时候进行连接;

  显然最后种是冗余最少不过查询时候要做次连接操作如何选择还是看具体情况了

  Mapping a Class against Arbitary Selects

  将对象映射到任意 select其实也就是任意 sql 子查询

  这功能太强大了有了这个后我们就可以骄傲地宣称(几乎)没有什么是 sqlalchemy 做不了了!

  Identity Map

  session 在 sqlalchemy 中是个非常重要概念session 跟踪对象修改情况跟踪对象的间关联智能判断数据库操作执行顺序等等

  Identity Map 是 session 中个容易让人掉入陷阱概念你可以把它想象成个以数据表主键为keycache每次从数据库查询后如果 sqlalchemy 发现 Identity Map 中已经有了相同主键例子那就不会重新生成例子了如果存在多个例子会带来许多问题比如多个例子分别修改并保存时就会产生混乱

  偶尔 Identity Map 也会产生些意想不到行为比如 ticket 458 不过理解了 Identity Map 机理后也就没什么问题了

  值得Mapper Options 有个 always_refresh 参数如果把它设为True则对该 mapper 任何查询操作都会自动使用从数据库中查询到数据覆盖 Identity Map 中已有例子这样要是对旧例子做过什么还没保存修改就都没了所以要慎用!

  Cascade rules

  最后这个也是很有用功能举个例子来说吧user 和 article 有对多关系现在删除个 user是否应该把相关 article 也删了呢要 article 还有其他依赖关系呢?这些决定当然是要根据实际需求来而控制这些行为思路方法就是通过 relation cascade 参数具体取值及其含义看文档去吧

  总滴来说本文只是个提纲作用具体还得去看文档看举例看unittest

  最后还想说两句就是大家的所以选择 ORM 主要原因是逃离 SQL然而我感觉不能掌握 SQL 是不能(很好)掌握sqlalchemy至少要对关系数据库这些概念了解理解 SQL 就是理解关系数据库只有这样才能利用sqlalchemy将关系数据库发挥到极致!

  使用 sqlalchemy 好处就是不用写 sql 了屏蔽区别dbms的间SQL语法区别同时又让你在需要时候能够利用到区别 DBMS 提供些独特特性让你以对象方式管理数据库访问代码提高代码重用性!

Tags:  强大的容器 pythonsqlalchemy sqlalchemy

延伸阅读

最新评论

发表评论