SQLAlchemy中的 session和scoped_session 的区别?
SQLAlchemy 是一个 Python 的 SQL 工具包和对象关系映射(ORM)系统,它提供了一种方式来在 Python 中与数据库进行交互。在 SQLAlchemy 中,session
和 scoped_session
都是处理数据库会话(database session)的重要组件,但它们在使用和目的上有一些区别。
- Session
在 SQLAlchemy 中,session
是一个临时的数据库会话,它代表了与数据库的一次交互过程。你可以用它来执行 SQL 查询,添加、修改或删除数据库中的对象等。一个 session
通常在其生命周期内处理一个特定的任务,完成后就被丢弃。
例如:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
nickname = Column(String)
# 创建引擎
engine = create_engine('sqlite:///example.db')
# 创建 DBSession 类型
DBSession = sessionmaker(bind=engine)
# 创建新 Session 对象
session = DBSession()
# 添加新记录
new_user = User(name='wendy', fullname='Wendy Williams', nickname='windy')
session.add(new_user)
session.commit()
# 关闭 Session
session.close()
在这个例子中,session
被用来添加一个新的 User
到数据库中,然后提交这个改变,最后关闭 session
。
- Scoped Session
scoped_session
是 SQLAlchemy 中的一个工厂函数,它返回一个 session
对象,但会确保在特定的范围内(如 web 请求)只创建一个 session
对象。这对于需要跨多个函数或方法使用同一个 session
的情况非常有用,例如在 web 应用程序中,你可能希望在处理一个请求的过程中使用同一个 session
。
使用 scoped_session
可以避免因为多次创建和关闭 session
而导致的性能开销,同时它也可以确保在同一个范围内所有的数据库操作都在同一个 session
中进行,这有助于保持数据的一致性。
例如:
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
engine = create_engine('sqlite:///example.db')
Session = sessionmaker(bind=engine)
Session = scoped_session(Session)
# 在此范围内,无论何时调用 Session(),都会返回同一个 session 对象
session = Session()
在这个例子中,scoped_session
确保在同一个范围内,无论何时调用 Session()
,都会返回同一个 session
对象。
总的来说,session
和 scoped_session
的主要区别在于它们的生命周期和用途。session
通常用于一次性的数据库交互,而 scoped_session
则用于在特定的范围内保持一个持久的数据库会话。