关于ORM,以及Python中SQLAlchemy的sessionmaker,scoped_session
orm(object relational mapping):对象关系映射。
python面向对象,而数据库是关系型。
orm是将数据库关系映射为Python中的对象,不用直接写SQL。
缺点是性能略差。
通过sessionmaker,我们得到一个类,一个能产生session的工厂。
我们可以用这个类的对象来操作数据库。example:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # an Engine, which the Session will use for connection
# resources
some_engine = create_engine('postgresql://scott:tiger@localhost/') # create a configured "Session" class
Session = sessionmaker(bind=some_engine) # create a Session
session = Session() # work with sess
myobject = MyObject('foo', 'bar')
session.add(myobject)
session.commit()

然而,此时如果我们再创建一个Session对象的时候,新的对象和原来的对象是不同的:
......
>>> session1 = Session()
>>> session2 = Session()
>>> session1 is session2
False
而使用scoped_session的目的主要是为了线程安全。
scoped_session类似单例模式,当我们调用使用的时候,会先在Registry里找找之前是否已经创建session了。
要是有,就把这个session返回。
要是没有,就创建新的session,注册到Registry中以便下次返回给调用者。
这样就实现了这样一个目的:在同一个线程中,call scoped_session 的时候,返回的是同一个对象:

>>> from sqlalchemy.orm import scoped_session
>>> from sqlalchemy.orm import sessionmaker >>> session_factory = sessionmaker(bind=some_engine)
>>> Session = scoped_session(session_factory) >>> some_session = Session()
>>> some_other_session = Session()
>>> some_session is some_other_session
True

scoped_session实现了代理模式。能够将操作转发到代理的对象中去执行:

Session = scoped_session(some_factory) # equivalent to:
#
# session = Session()
# print(session.query(MyClass).all())
#
print(Session.query(MyClass).all())

scoped_session的实现使用了thread local storage技术,使session实现了线程隔离。这样我们就只能看见本线程的session。
ref:http://docs.sqlalchemy.org/en/latest/orm/contextual.html#unitofwork-contextual
https://farer.org/2017/10/28/sqlalchemy_scoped_session/
http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#session-faq-whentocreate
http://hshsh.me/post/2016-04-10-python-proxy-class-examples/
关于ORM,以及Python中SQLAlchemy的sessionmaker,scoped_session的更多相关文章
- 关于ORM,以及Python中SQLAlchemy的scoped_session
orm(object relational mapping):对象关系映射. python面向对象,而数据库是关系型. orm是将数据库关系映射为Python中的对象,不用直接写SQL. 缺点是性能略 ...
- python之SQLAlchemy ORM 上
前言: SQLAlchmey是暑假学的,当时学完后也没及时写博客整理下.这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.下篇博客整理写篇关于Web框架和django基础~ ...
- python中mysql数据库的操作-sqlalchemy
MySQLdb支持python2.*,不支持3.* ,python3里面使用PyMySQL模块代替 python3里面如果有报错 django.core.exceptions.ImproperlyC ...
- Python中操作SQLAlchemy
一.ORM 框架简介 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法 ...
- SQLAlchemy(1) -- Python的SQLAlchemy和ORM
Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...
- python之SQLAlchemy ORM
前言: 这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.有兴趣可看下python之数据库(mysql)操作.下篇博客整理写篇关于Web框架和django基础~~ 一.OR ...
- Python中的SQLAlchemy
在Python中,使用SQLAlchemy可以对数据库进行操作. SQLAlchemy是Python中的一个标准库. 要使用SQLAlchemy,首先要创建连接: url = mysql+pymysq ...
- Python 9 sqlalchemy ORM
一.ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型 ...
- sqlalchemy python中的mysql数据库神器
在介绍sqlalchemy之前,我们先了解一下ORM. ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.也就是说ORM 将数据库中的表与面向对象语言中的类建 ...
随机推荐
- 在Windows Server 2008 R2上打开ping的方法
默认安装完Windows Server 2008 R2后,从外面ping服务器的地址是ping不通的,原因是服务器防火墙默认关闭了ICMP的回显请求.需要按照如下方法打开: 在服务器管理器中选择“配置 ...
- 【传感器】BMA253 数字,三轴加速度传感器
参考文档:BMA253E DataSheet 参考文档链接 密码:9new BMA253 数字,三轴加速度传感器 关键特性: 关键特性 封装方式 LGA封装(12pins),长*宽(2mm*2mm ...
- python图片文字识别笔记
我的环境为python3 坑比较多,在此做记录,以备查阅 命令行安装: pip install PIL pip install pytesseract pip install Pillow 下载tes ...
- [Usaco2008 Open]Word Power 名字的能量
1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 408 Solved: 19 ...
- [nowcoder]最长区间
链接:https://www.nowcoder.com/acm/contest/158/B 求最长连续严格递增序列 线段树模板题,码力弱的一匹调了半天.. 代码: #include<iostre ...
- 什么是Zero-Copy?
概述 考虑这样一种常用的情形:你需要将静态内容(类似图片.文件)展示给用户.那么这个情形就意味着你需要先将静态内容从磁盘中拷贝出来放到一个内存buf中,然后将这个buf通过socket传输给用户,进而 ...
- JavaEE之动态代理
jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 动态代理:程序运行时,使用JDK提供工具类(Proxy),动态创建一个类,此类一般用于代理. 代理类需要实现Inv ...
- [LnOI2019]加特林轮盘赌(DP,概率期望)
[LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...
- DPDK l3fwd
l3fwd负责三层转发,比l2fwd要复杂点. /*- * BSD LICENSE * * Copyright(c) 2010-2014 Intel Corporation. All rights r ...
- MongoError: server instance in invalid state undefined 解决办法
MongoDB关键点集锦(更新中...) 2017-01-20 09:33:48[其它数据库]点击数:15作者:Real_Bird的博客来源: 网络 随机为您推荐的文章:MongDB索引的介绍及使用 ...