Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍


Posted in Python onJune 10, 2014

1. 创建映射类的实例(Instance)

前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象:

>>> ed_user = User('ed', 'Ed Jones', 'edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'

和普通的Python类一样实例化,大家可能会问为什么ed_user.id会是None值,首先id这个属性没有通过__init__()构造方法初始化,所以默认会因为先前定义的ORM的id列(Column)而产生一个None值,在默认情况下,ORM会为所有被映射的表列创建类属性,这些属性是通过Python语言中描述符(Descriptors)机制来实现的。所以这些属性的使用会包含一些额外的行为,包括跟踪修改,或者当需要时自动从数据库加载新的数据,也就是说我们在使用这些属性时,包括修改或者读取,都会触发ORM内部的一系列动作。

等等,你还没有说明白为什么id这个属性会为None值呢。呵呵,其实我们现在并没有将数据插入数据库,一般主键这个属性会在插入数据库时自动产生一个不重复的值以保证唯一性。由于我们没有对对象实行持久化(Persist) (所谓的持久化就是把对象数据按照映射关系存储入数据库里) 所以这里id值为None。别着急,稍后当我们介绍将数据持久化后你就可以看到一个新的自动产生的id了。

接下来小偷懒一下,介绍一个偷懒的技巧:-)

假如我们不定义映射类的构造方法__init__()会带来什么不良影响吗?完全不会,SQLAlchemy为我们考虑到这点,假如我们偷懒将先前的User类定义成这样:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

由于User继承自Base (Base定义见上一篇文章),所以受到Declarative系统的管理,Declarative系统发现这个类缺少构造方法,于是很友善的给我们补上了一个构造方法,当然其提供的构造方法则不能像我们自己定义的构造方法那样使用基于位置的参数访问,建议使用基于键的参数访问方式,包括我们所有用Column定义映射的列,比如如下方式:
u1 = User(name='ed', fullname='Ed Jones', password='foobar')

id也可以传入,通常意义上这类主键由系统自动维护,我们无需为其赋值。

2. 创建并使用会话(Session)

到这里可谓是“万事俱备,只欠东风了”,用官方文档的话说“我们现在已经准备好和数据库‘交谈'了” (We're now ready to start talking to the database)。ORM的操作句柄(Handle)被称为会话(Session)。为了使用会话,我们需要先配置它,配置Session的代码语句应该和create_engine()创建引擎的代码语句在一个代码级别上(放在一起就行了)。

比如我们利用create_engine()先建立起引擎名字为engine(关于引擎的建立代码可以参考我第一篇文章),然后利用sessionmaker()工厂函数建立起Session类,同时绑定我们现有的引擎,比如代码如下:

>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)

假如我们创建Session的代码与创建引擎的代码不在一个级别上呢,比如先sessionmaker()一个Session类,然后才用create_engine()创建了引擎,那么我们还有机会将Session和引擎绑定到一起吗?当然可以,我们可以利用Session类的configure方法来配置引擎绑定,比如这样的:
Session = sessionmaker()
# engine = create_engine(...) 创建引擎
Session.configure(bind=engine)  # 到这里engine应该已经创建

到这里通过sessionmaker()工厂创造出的Session类应该绑定了我们先前创建的Engine了,但是会话还没有真正开始,要开始会话我们需要实例化这个Session类:
>>> session = Session()

到这里session就获取了由Engine维护的数据库连接池,并且会维持内存中的映射数据直到提交(commit)更改或者关闭会话对象。

到这里会话的建立就讲解完了,接下来会讲解真正的ORM数据库查询部分,欢迎关注!

Python 相关文章推荐
python装饰器使用方法实例
Nov 21 Python
python使用递归解决全排列数字示例
Feb 11 Python
python中星号变量的几种特殊用法
Sep 07 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
python实现猜拳小游戏
Apr 05 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
python实现飞行棋游戏
Feb 05 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
python-for x in range的用法(注意要点、细节)
May 10 Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 #Python
Python使用htpasswd实现基本认证授权的例子
Jun 10 #Python
python网络编程学习笔记(10):webpy框架
Jun 09 #Python
python网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 #Python
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 #Python
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 #Python
You might like
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
PHP序列化操作方法分析
2016/09/28 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
python中黄金分割法实现方法
2015/05/06 Python
讲解Python中if语句的嵌套用法
2015/05/14 Python
理解python正则表达式
2016/01/15 Python
全面理解Python中self的用法
2016/06/04 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
python计算导数并绘图的实例
2020/02/29 Python
python 下载文件的几种方法汇总
2021/01/06 Python
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
什么时候需要进行强制类型转换
2016/09/03 面试题
大学生毕业求职的自我评价
2013/09/29 职场文书
师德师风演讲稿
2014/05/05 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
重阳节慰问信
2015/02/15 职场文书
收入证明申请书
2015/06/12 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python