Python数据库ORM SQLAlchemy 0.7学习笔记(3) 会话
2015-08-27 14:54
393 查看
1. 创建映射类的实例(Instance)
前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象:
和普通的Python类一样实例化,大家可能会问为什么
等等,你还没有说明白为什么
(所谓的持久化就是把对象数据按照映射关系存储入数据库里) 所以这里
接下来小偷懒一下,介绍一个偷懒的技巧:-)
假如我们不定义映射类的构造方法
由于User继承自Base (Base定义见上一篇文章),所以受到Declarative系统的管理,Declarative系统发现这个类缺少构造方法,于是很友善的给我们补上了一个构造方法,当然其提供的构造方法则不能像我们自己定义的构造方法那样使用基于位置的参数访问,建议使用基于键的参数访问方式,包括我们所有用
2. 创建并使用会话(Session)
到这里可谓是“万事俱备,只欠东风了”,用官方文档的话说“我们现在已经准备好和数据库‘交谈’了” (We’re now ready to start talking to the database)。ORM的操作句柄(Handle)被称为会话(Session)。为了使用会话,我们需要先配置它,配置Session的代码语句应该和
比如我们利用
假如我们创建Session的代码与创建引擎的代码不在一个级别上呢,比如先
到这里通过
到这里session就获取了由Engine维护的数据库连接池,并且会维持内存中的映射数据直到提交(commit)更改或者关闭会话对象。
到这里会话的建立就讲解完了,接下来会讲解真正的ORM数据库查询部分,欢迎关注!
前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象:
>>> ed_user = User('ed', 'Ed Jones', 'edspassword') >>> ed_user.name 'ed' >>> ed_user.password 'edspassword' >>> str(ed_user.id) 'None' |
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) |
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) |
sessionmaker()一个Session类,然后才用
create_engine()创建了引擎,那么我们还有机会将Session和引擎绑定到一起吗?当然可以,我们可以利用Session类的configure方法来配置引擎绑定,比如这样的:
Session = sessionmaker() # engine = create_engine(...) 创建引擎 Session.configure(bind=engine) # 到这里engine应该已经创建 |
sessionmaker()工厂创造出的Session类应该绑定了我们先前创建的Engine了,但是会话还没有真正开始,要开始会话我们需要实例化这个Session类:
>>> session = Session() |
到这里会话的建立就讲解完了,接下来会讲解真正的ORM数据库查询部分,欢迎关注!
相关文章推荐
- Python数据库ORM SQLAlchemy 0.7学习笔记(2) 定义映射
- Python数据库ORM SQLAlchemy 0.7学习笔记(1) 概要
- 循环下载图片,跳过不可用url
- 使用py2exe 将python文件转成exe文件(以及 error: [Errno 2] No such file or directory: 'MSVCP90.dll'解决方法)
- Python扩展包安装方法以及Python添加库(模块)
- python的学习库资料
- Python & Deep Belief Network
- python学习笔记:easygui的简单示例
- 调用python 报R6034 错误
- python学习--核心编程5习题以及知识点记录
- Python 3.4 简单的抓图脚本
- Python 2.7 (64 bit )下安装 OpenCV 3.0
- python setuptools安装与psutil模块测试
- python文件中的__name__=='__main__'的使用及调用其他py文件中的函数方法
- multiprocessing 基于进程的“线程式”接口 python
- python setuptools安装与psutil模块测试
- 两个使用Python脚本操作文件的小示例分享
- python 读写Json的中文编码问题
- IDEA中python内建函数出现红色波浪下划线,但运行正常
- 关于Python中,re.sub(pattern, repl, string, count=0, flags=0)方法的个人理解