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的更多相关文章

  1. 关于ORM,以及Python中SQLAlchemy的scoped_session

    orm(object relational mapping):对象关系映射. python面向对象,而数据库是关系型. orm是将数据库关系映射为Python中的对象,不用直接写SQL. 缺点是性能略 ...

  2. python之SQLAlchemy ORM 上

    前言: SQLAlchmey是暑假学的,当时学完后也没及时写博客整理下.这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.下篇博客整理写篇关于Web框架和django基础~ ...

  3. python中mysql数据库的操作-sqlalchemy

    MySQLdb支持python2.*,不支持3.* ,python3里面使用PyMySQL模块代替 python3里面如果有报错  django.core.exceptions.ImproperlyC ...

  4. Python中操作SQLAlchemy

    一.ORM 框架简介 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法 ...

  5. SQLAlchemy(1) -- Python的SQLAlchemy和ORM

    Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...

  6. python之SQLAlchemy ORM

    前言: 这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.有兴趣可看下python之数据库(mysql)操作.下篇博客整理写篇关于Web框架和django基础~~ 一.OR ...

  7. Python中的SQLAlchemy

    在Python中,使用SQLAlchemy可以对数据库进行操作. SQLAlchemy是Python中的一个标准库. 要使用SQLAlchemy,首先要创建连接: url = mysql+pymysq ...

  8. Python 9 sqlalchemy ORM

    一.ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型 ...

  9. sqlalchemy python中的mysql数据库神器

    在介绍sqlalchemy之前,我们先了解一下ORM. ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.也就是说ORM 将数据库中的表与面向对象语言中的类建 ...

随机推荐

  1. Xshell 或者 Xftp 突然连不上阿里云

    今天突然发现使用xshell 远程连接不上阿里云,废了好大的劲,才明白的差不多.只要不出意外有以下几种情况:1.安全组中有没有你需要连接的端口,2.防火墙是否关闭,3.端口是否开放权限,4.是否安装了 ...

  2. linux中的信号简介和trap命令

    1.信号 linux通过信号来在运行在系统上的进程之间通信,也可以通过信号来控制shell脚本的运行 主要有一下信号 1 ##进程重新加载配置 2 ##删除进程在内存中的数据 3 ##删除鼠标在内存中 ...

  3. 20145219 《Java程序设计》第08周学习总结

    20145219 <Java程序设计>第08周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是log ...

  4. 20145109《Java程序设计》第二周学习总结

    20145109 <Java程序设计>第二周学习总结 教材学习内容总结 Variable : naming rule : Camel case no default value e.g : ...

  5. 进程管理工具supervisor

    1. 简介 supervisor有两个组件:supervisord和supervisorctl,组成了client/server结构. supervisord负责读入配置文件,然后supervisor ...

  6. struts2——文件下载自定义文件名,包括中文

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. 前端开发日记之jQuery

    优先引入CDN上的jQuery,如果失效再引入本地的jQuery! <script src="http://libs.baidu.com/jquery/1.11.1/jquery.js ...

  8. Dynamo论文介绍

    http://catkang.github.io/2016/05/27/dynamo.html Dynamo是Amazon开发的分布式存储系统,本文是阅读Dynamo论文后的总结:Dynamo: Am ...

  9. GO学习笔记:面向对象--method

    现在假设有这么一个场景,你定义了一个struct叫做长方形,你现在想要计算他的面积,那么按照我们一般的思路应该会用下面的方式来实现: package main import "fmt&quo ...

  10. python 实现简单点名程序

    程序会遍历文件所有姓名,遍历完之前不会有重复值,遍历所有后将提示推出. #-*-coding:utf-8-*-#author:wangxing #点名程序 import randomimport os ...