在使用SQLalchemy构建模型时,我正在使用declarative_base ... 所以我有一个看起来像这样的模型:
from sqlalchemy.orm import sessionmaker, scoped_session
engine = create_engine("mysql...")
session_factory = sessionmaker(bind=engine)
SessionHeap = scoped_session(session_factory)
Base = declarative_base()
class MyTable(Base, Actions):
__tablename__ = 'mytable'
id = Column(Integer, primary_key=True)
date = Column(Integer)
tag = Column(String(50))
class Actions(object):
@classmethod
def create(cls, **kwargs):
session = SessionHeap()
session.add(cls(**kwargs))
session.commit()
session.close()
SessionHeap.remove()
def update(self, **kwargs):
for key, val in kwargs.iteritems():
self.__setattr__(key, val)
session = inspect(self).session
session.commit()
@classmethod
def _search(cls, **kwargs):
session = SessionHeap()
query = session.query(cls).filter_by(**kwargs)
session.commit()
session.close()
SessionHeap.remove()
return query
我不确定何时应该调用session.close(),甚至何时删除会话,我一直遇到麻烦,特别是对于查询,某些会话不会关闭而数据库挂起。什么是更好的模式呢? (注意我想保留所有方法包含在模型本身中,而不是在其他一些全局命名空间中)
答案 0 :(得分:2)
简短回答:这是针对特定应用的。
如果您正在实施长时间运行的进程(如后端守护进程),则可能需要在每个会话生命周期内执行多次提交。如果您正在使用HTTP应用程序,则该模式通常是每个HTTP请求一次提交(最后,在连接拆除时)。大多数现代Web框架都提供了请求设置/拆卸的钩子。例如,在Flask中,您可以将session.commit()/ session.close()放在用@ app.teardown_request修饰的方法下。
我建议采用以下方法: