這個例子說明了我在構建的應用程序中遇到的一個謎題。應用程序需要支持一個選項,允許用戶在不實際提交數據庫更改的情況下執行代碼。但是,當我添加此選項時,即使沒有調用commit()
方法,我也發現更改仍保留在數據庫中。爲什麼此SQLAlchemy示例將更改提交給數據庫?
我的具體問題可以在代碼註釋中找到。基本目標是更清楚地瞭解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()
我試圖回答您的具體問題,但是,是的,在參考你的**編輯:**,我肯定會去的(B)的路線。全局會話實例只是要求問題與此類似。 – snapshoe 2010-10-26 05:28:41