【发布时间】:2011-04-29 06:03:12
【问题描述】:
这个例子说明了我在构建的应用程序中遇到的一个谜。应用程序需要支持一个选项,允许用户执行代码而不实际提交对数据库的更改。但是,当我添加此选项时,我发现即使我没有调用 commit() 方法,更改也会保留到数据库中。
我的具体问题可以在代码 cmets 中找到。基本目标是更清楚地了解 SQLAlchemy 何时以及为什么会提交到数据库。
我更广泛的问题是我的应用程序是否应该 (a) 使用全局 Session 实例,或者 (b) 使用全局 Session 类,从中实例化特定实例。基于这个例子,我开始认为正确的答案是(b)。那正确吗? 编辑:this SQLAlchemy documentation 建议使用 (b)。
import sys
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key = True)
name = Column(String)
age = Column(Integer)
def __init__(self, name, age = 0):
self.name = name
self.age = 0
def __repr__(self):
return "<User(name='{0}', age={1})>".format(self.name, self.age)
engine = create_engine('sqlite://', echo = False)
Base.metadata.create_all(engine)
Session = sessionmaker()
Session.configure(bind=engine)
global_session = Session() # A global Session instance.
commit_ages = False # Whether to commit in modify_ages().
use_global = True # If True, modify_ages() will commit, regardless
# of the value of commit_ages. Why?
def get_session():
return global_session if use_global else Session()
def add_users(names):
s = get_session()
s.add_all(User(nm) for nm in names)
s.commit()
def list_users():
s = get_session()
for u in s.query(User): print ' ', u
def modify_ages():
s = get_session()
n = 0
for u in s.query(User):
n += 10
u.age = n
if commit_ages: s.commit()
add_users(('A', 'B', 'C'))
print '\nBefore:'
list_users()
modify_ages()
print '\nAfter:'
list_users()
【问题讨论】:
-
我试图回答您的具体问题,但是,是的,参考您的 Edit:,我肯定会走 (b) 路线。一个全局会话实例只是询问与此完全相同的问题。
标签: python session sqlalchemy commit