SQLAIchemy 学习(一)Session 相关

2022-11-23 19:34:32 浏览数 (2)

0. 前言

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

1. 创建 Session

  • 说到数据库,就离不开 Session。Session 的主要目的是建立与数据库的会话,它维护数据库的连接,也是数据库查询(Query)的一个入口
  • 在SQLAlchemy中,数据库的查询操作是通过 Query 对象来实现的。而 Session 提供了创建 Query 对象的接口
  • Query 对象返回的结果是一组同一映射对象组成的集合
    • 集合中的一个对象,对应于数据库表中的一行(即一条记录)
    • 所谓同一映射,是指每个对象有一个唯一的 ID。如果两个对象(的引用)ID 相同,则认为它们对应的是相同的对象
  • 要完成数据库查询,就需要建立与数据库的连接。这就需要用到 Engine 对象。一个 Engine 可能是关联一个 Session 对象,也可能关联一个数据库表
代码语言:javascript复制
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 最重要的功能是实现原子操作:
代码语言:javascript复制
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 对象
代码语言:javascript复制
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. 参考文献

  • sqlalchemy 学习(一)创建Session和Engine
  • sqlalchemy 学习(二)scoped session

0 人点赞