0. 前言

  • 最近是使用 SQLAlchemy 框架作为一个 ORM 框架,现对其做简单整理

1. 创建 Session

  • 说到数据库,就离不开 Session。Session 的主要目的是建立与数据库的会话,它维护数据库的连接,也是数据库查询(Query)的一个入口
  • 在SQLAlchemy中,数据库的查询操作是通过 Query 对象来实现的。而 Session 提供了创建 Query 对象的接口
  • Query 对象返回的结果是一组同一映射对象组成的集合
    • 集合中的一个对象,对应于数据库表中的一行(即一条记录)
    • 所谓同一映射,是指每个对象有一个唯一的 ID。如果两个对象(的引用)ID 相同,则认为它们对应的是相同的对象
  • 要完成数据库查询,就需要建立与数据库的连接。这就需要用到 Engine 对象。一个 Engine 可能是关联一个 Session 对象,也可能关联一个数据库表
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker some_engine = create_engine('nysql://username:password@localhost/mydb?charset=utf8') ession = sessionmaker(bind=some_engine) session = Session()
  • Session 最重要的功能是实现原子操作:
class SomeThing(object):
def go(self, session):
# Do something def run_my_program():
session = Session()
try:
SomeThing().go(session)
session.commit()
except:
session.rollback()
raise
finally:
session.close()

2. 生命周期

  • SQLAlchemy 提供了一个简单的 session 管理机制,即 scoped session
  • 它采用的注册模式。所谓的注册模式,简单来说,是指在整个程序运行的过程当中,只存在唯一的一个 session 对象
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker session_factory = sessionmaker(bind=some_engine)
some_session = Session() # 全局唯一,session1 = Session() 和 session2 = Session() 引用相同,除非其中一个先销毁
  • scoped session 本质上是一个全局变量。可是,如果直接把 session 定义成全局变量,在多线程的环境下,会造成线程同步的问题
  • 为此,scoped session 在默认情况下,采用的线程本地化存储方式。也就是说,每个线程的 session 对象是不同的。这样,不同线程对数据库的操作不会相互影响

3. 参考文献

SQLAIchemy 学习(一)Session 相关的更多相关文章

  1. Servlet的学习之Session(3)

    在上一篇<Servlet的学习之Session(2)>我们知道了Session能实现一个会话过程中保存数据或者多个会话中实现同一个Session的关键因素就是Cookie,只是Cookie ...

  2. Servlet的学习之Session(2)

    在上一篇中我们学习了Session对象默认在一个会话过程中,由服务器创建,能保存在这个会话过程中用户访问多个web资源时产生的需要保存的数据,并在访问服务器中其他web资源时可以将这些数据从Sessi ...

  3. Servlet的学习之Session(1)

    在学习完了Servlet中的Cookie技术后,我们再来学习另一个能保存会话数据的技术——Session. Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其 ...

  4. 面试回顾——session相关

    原地址:https://blog.csdn.net/quiet_girl/article/details/50580095 Session结束生命周期的几种情况: (1)客户端关闭浏览器(只针对ses ...

  5. MySQL学习笔记-事务相关话题

    事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都 ...

  6. Oracle session相关数据字典(一)

    (一)session相关视图 (1)视图 v$session v$active_session_history dba_hist_active_session_history 如果是多节点数据库,v$ ...

  7. Spark学习之基础相关组件(1)

    Spark学习之基础相关组件(1) 1. Spark是一个用来实现快速而通用的集群计算的平台. 2. Spark的一个主要特点是能够在内存中进行计算,因而更快. 3. RDD(resilient di ...

  8. ThreeJS学习6_几何体相关(BufferGeometry)

    ThreeJS学习6_几何体相关(BufferGeometry) 使用 BufferGeometry 可以有效减少向 GPU 传输几何体相关数据所需的开销 可以自定义顶点位置, 面片索引, 法向量, ...

  9. node学习笔记9——cookie,session相关操作

    下面讲的都是基Express及相关的包.所以在实践本篇文章之前,通过npm安装好Express, cookie-parser, cookie-session这三个安装包. 先简单说一下,如何用Expr ...

随机推荐

  1. QT+OpenGL(04)—freetype库的编译

    1.freetype库的下载 https://www.freetype.org/download.html freetype-2.10.0.tar.bz2 2.解压 3.进入  freetype-2. ...

  2. Java自学-集合框架 HashMap

    Java集合框架 HashMap 示例 1 : HashMap的键值对 HashMap储存数据的方式是-- 键值对 package collection; import java.util.HashM ...

  3. oracle 创建表、删除表、添加字段、删除字段、表备注、字段备注、修改表属性

    1.创建表 create table 表名( classid number() primary key, 表字段 数据类型 是否允许为空(not null:不为空/null:允许空) 默认值(defa ...

  4. Java开发常用知识点总结

    docker exec -it imageId redis-cli docker container ls -a docker rm containerId 复制目录&文件 cp -r /ro ...

  5. Struts2 : action跳转时带参数跳转

    在实现action跳转到另一个action时,需要携带参数,可以直接在struts.xml配置文件中对应的跳转action的地方加上,参数的配置,用ognl表达式,可以从session中取值. 如果要 ...

  6. java web spring异步方法

    在项目中,时常会有异步调用的需求 web.xml配置 <servlet> <description>spring mvc servlet</description> ...

  7. PL/SQL Developer报错 ORA-12154:tns:could not resolve the connect identifier specified

    PL/SQL Developer使用预先配置数据库报错 ORA-12154:tns:could not resolve the connect identifier specified. 情况描述:我 ...

  8. 201871010109-胡欢欢《面向对象程序设计(java)》第6-7周学习总结

    实验六 继承定义与使用 实验时间 2019-9-29 第一部分:理论部分. 1.继承:已有类来构建新类的一种机制.档定义了一个新类继承另一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的 ...

  9. 201871010134-周英杰《面向对象程序设计(java)》第十四周学习总结

    项目 内容 这个作业属于哪个课程 <https://home.cnblogs.com/u/nwnu-daizh/> 这个作业的要求在哪里 <https://www.cnblogs.c ...

  10. LiunxCentos7 上安装 FastDFS

    Centos7 上安装 FastDFS 1.安装gcc(编译时需要) FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gc ...