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中查找excel某一列的重复数据 剔除之后打印
Feb 10 Python
python中wx将图标显示在右下角的脚本代码
Mar 08 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Python实现购物车购物小程序
Apr 18 Python
Python对象转换为json的方法步骤
Apr 25 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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模板类代码
2008/09/07 PHP
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
毕业生自我推荐
2013/11/04 职场文书
大学生关于奋斗的演讲稿
2014/01/09 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
国际经济贸易专业自荐信
2014/06/13 职场文书
班级体育活动总结
2014/07/05 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
六年级学生评语大全
2014/12/26 职场文书
导游词之包公祠
2019/11/25 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL