SQLAlchemy:将当前会话包装到模型中的正确方法?

2024-10-01 13:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用SQLalchemy构造我的模型时使用的是声明性的。。。 所以我有一个模型是这样的:

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         

我不知道什么时候该打电话会话.关闭()或者甚至何时删除会话,我一直有麻烦,尤其是在查询时,某些会话无法关闭,数据库会挂起。什么是更好的模式?(注意,我希望将所有方法包装到模型本身中,而不是其他全局命名空间中)


Tags: key模型selfsessiondefcreatecolumnquery
1条回答
网友
1楼 · 发布于 2024-10-01 13:26:40

简单回答:这是特定于应用程序的。在

如果要实现长时间运行的流程(如后端守护进程),则可能需要在每个会话生命周期内执行多个提交。如果您正在处理一个HTTP应用程序,模式通常是每个HTTP请求一次提交(在最后,在连接断开时)。大多数现代web框架都提供了请求设置/删除的钩子。例如,在烧瓶里你可以把你会话.提交() / 会话.关闭()在一种装饰有@app.teardown_请求. 在

我建议采用以下方法:

  • (来自SQLAlchemy docs)作为一般规则,保持会话的生命周期与访问和/或操作数据库数据的函数和对象分开且外部。这将大大有助于实现可预测和一致的事务范围。在
  • 更换会话.提交()以上声明会话.刷新()陈述。flush()将在不提交事务的情况下持久化数据。删除会话.关闭()陈述。记得,会话.关闭()将把连接返回到引擎/连接池,它实际上并没有关闭连接。在
  • 实现您的自定义DBRollbackException()异常,使用它在发生任何错误时回滚当前事务。在
  • 最后提交一次(例如,根据请求拆卸)

相关问题 更多 >