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 相关文章推荐
400多行Python代码实现了一个FTP服务器
May 10 Python
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
Python中isnumeric()方法的使用简介
May 19 Python
Python实现Linux命令xxd -i功能
Mar 06 Python
python编写简易聊天室实现局域网内聊天功能
Jul 28 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
Python shelve模块实现解析
Aug 28 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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
中国收音机工业发展史
2021/03/02 无线电
php全角字符转换为半角函数
2014/02/07 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
php使用正则验证中文
2016/04/06 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
JavaScript编写开发动态时钟
2020/07/29 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
利用Python循环(包括while&for)各种打印九九乘法表的实例
2017/11/06 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
罗技美国官网:Logitech美国
2020/01/22 全球购物
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
审核会计岗位职责
2013/11/08 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
视光学专业自荐信
2014/06/24 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
自主招生学校推荐信
2014/09/26 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers