强大的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 提供三种方式:

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 中一个容易让人掉入陷阱的概念,你可以把它想象成一个以数据表主键为key的cache。每次从数据库查询后,如果 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 提供的一些独特特性,让你以对象的方式管理数据库访问代码,提高代码重用性!

时间: 2024-11-16 14:58:22

强大的sqlalchemy的相关文章

用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy

目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 ModelView 实现效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 Flask 来写个轻博客 (3) - (M)VC_连接 MySQL 和 SQLAlchemy 用 Flask 来写个轻博客 (4) - (M)VC_创建数据模型和表 用 Flask 来写个轻博客 (5) - (M)VC_SQLAlchemy 的 C

SQLAlchemy参考

1. 基本流程 # -*- coding: utf-8 -*- from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy import Column from sqlalchemy.types import String, Integer from sqlalchemy.ext.declarative import declarative_base engine = c

Python数据库ORM工具sqlalchemy的学习笔记

SQLAlchemy是python的一个数据库ORM工具,提供了强大的对象模型间的转换,可以满足绝大多数数据库操作的需求,并且支持多种数据库引擎(sqlite,mysql,postgres, mongodb等),在这里记录基本用法和学习笔记. 一.安装 通过pip安装 $ pip install SQLAlchemy  二.使用 首先是连接到数据库,SQLALchemy支持多个数据库引擎,不同的数据库引擎连接字符串不一样,常用的有 mysql://username:password@hostna

python下sqlalchemy模块使用详解

  sqlalchemy简介 SQLAlchemy是 Python 编程语言下的一款开源软件.提供了SQL工具包及 对象关系映射 (ORM)工具,使用 MIT许可证 发行. SQLAlchemy"采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型".SQLAlchemy的理念是, SQL数据库 的量级和性能重要于对象集合:而对象集合的抽象又重要于表和行.因此,SQLAlchmey采用了类似于 Java 里 Hibernate 的数据映射模型,而不是其

Python ORM框架SQLAlchemy学习笔记之数据查询实例_python

前期我们做了充足的准备工作,现在该是关键内容之一查询了,当然前面的文章中或多或少的穿插了些有关查询的东西,比如一个查询(Query)对象就是通过Session会话的query()方法获取的,需要注意的是这个方法的参数数目是可变的,也就是说我们可以传入任意多的参数数目,参数的类型可以是任意的类组合或者是类的名称,接下来我们的例子就说明了这一点,我们让Query对象加载了User实例. 复制代码 代码如下: >>> for instance in session.query(User).or

win7系统右下角小旗子强大的作用

合理的利用win7系统在的功能,那么你根本不需要装其他方面的软件,对于新手基本上装个360安全卫士就行了.今天我们要来说的是win7操作中心的功能,也就是win7系统右下角小旗子的强大功能. 1 win7操作中心 在win7操作系统中,当我们把鼠标移到并单击右下角的小旗时,我们就会看到下图: 2 小编感觉功能比较好的就是这个图,它可以提醒我们系统中存在哪些安全隐患,还有那些功能需要维护.很多时候通过这边的设置能让你电脑的可被利用漏洞变得更少,让病毒无法破坏甚至进入你的系统. 3 win7操作中心

draggabilly一款功能强大的拖动拖拽元素插件

draggabilly一款功能强大的拖动拖拽元素插件:http://download.csdn.net/detail/cometwo/9411895 支持移动触摸设备的纯js元素拖放插件 :http://download.csdn.net/detail/cometwo/9411907 :"` <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" con

超级强大的vim配置(vimplus)

From : http://www.cnblogs.com/highway-9/p/5984285.html From : http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html From : http://www.cnblogs.com/youxia/p/linux002.html From : http://blog.csdn.net/namecyf/article/details/7787479 最近在重新配置Vim,也在

SEO内链强大是王道!外链靠边站!

内部链接好坏对于SEO的重要性,所有做SEO的朋友都了如指掌,所以一个合理的网站内部链接建设是相当重要的,具体如何做内链才能合理而有效呢?下面我以自己多年的SEO从业经验来一一说明一下! 一.网站导航必须使用文字导航 实际接手项目中,很多网站都是用图片或者JS写的导航,其实这样搜索引擎是无法抓取的,一定要用文字导航,因为搜索引擎对文字链接是友好的,如果导航实在没办法为了美观必须用JS或者图片,那么在底部或者左侧也要有文字的导航链接. 二.网站地图必不可少 一个合格的网站,网站地图是必不可少!因为