• SQLAIchemy 学习(一)Session 相关


    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. 参考文献

  • 相关阅读:
    Elasticsearch聚合 之 Date Histogram聚合
    Elasticsearch聚合 之 Terms
    Elasticsearch分析聚合
    mysql-聚合函数
    flask学习笔记(-操作数据库)
    在VS中调试javascript脚本
    jquery获取设置input值
    jquery后加Dom绑定事件
    Juicer——a fast template engine
    ASP.NET 一般处理程序
  • 原文地址:https://www.cnblogs.com/wangao1236/p/10900426.html
Copyright © 2020-2023  润新知