当前位置: 首页 > 面试题库 >

如何在sqlalchemy中管理此提交/回退模式

曾嘉荣
2023-03-14
问题内容

我发现自己在sqlalchemy中重复了很多这样的事情,我想知道处理它的最佳方法是什么?

try:
    #do some database query
    db_session.commit()
except: #some exception handling
    db_session.rollback()

问题答案:

从我的工作代码(会话注册表包装器的一种方法)来看,这是正确的。

它是这样使用的:

# dblink is an object that knows how to connect to the database
with dblink.CommittingSession() as session:
  session.add(...)
  # do anything else.
# at this point, session.commit() has been called.

要么:

try:
  with dblink.CommittingSession() as session:
    session.add(...)
except ...:
  # at this point, session.rollback has been called.
  log.error('We failed!')

实现:

from contextlib import contextmanager

class DbLink(object):
    """This class knows how to connect to the database."""
    # ...
    # Basically we wrap a sqlalchemy.orm.sessionmaker value here, in session_registry.
    # You might want to create sessions differently.

    @contextmanager
    def CommittingSession(self, **kwargs):
      """Creates a session, commits at the end, rolls back on exception, removes.

      Args:
        **kwargs: optional; supplied to session_registry while asking
          to construct a session (mostly for testing).

      Yields:
        a session object. The session will .commit() when a `with CommittingSession()`
        statement terminates normally, or .rollback() on an exception.
      """
      try:
        session = self.session_registry(**kwargs)  # this gives us a session.
        # transaction has already begun here, so no explicit .begin().
        yield session
      except:
        session.rollback()
        raise
      else:
        session.commit()
      finally:
        # Note: close() unbinds model objects, but keeps the DB connection.
        session.close()
        self.session_registry.remove()


 类似资料:
  • 问题内容: 如何设置初始化我的Flask应用程序以将Flask-SQLAlchemy设置为自动提交模式,除非我明确地不使用事务? 会话“ 开始通信后即开始数据库事务 ”。这是否会影响Postgres的难度比MySQL? 通过Instagram, 自动提交模式;在这种模式下,Psycopg2不会对任何查询发出BEGIN / COMMIT;相反,每个查询都在其自己的单语句事务中运行。这对于不需要事务语

  • HibernateTemplate api说: …当在事务之外使用时,它能够退回到“自动提交”风格的行为 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate3/HibernateTemplate.html 有人能指出发生这种情况的地方吗 https://github.com/

  • 问题内容: 我已阅读flask-sqlalchemy或sqlalchemy,它们建议将flask-sqlalchemy与flask一起使用。我想遵循这种方法。 但是,我有一个为命令行脚本编写的现有模型,该模型基于sqlalchemy的declarative_base,例如, 我希望仍然可以在此模型中使用命令行脚本,但也希望围绕该模型构建Web应用程序。 有没有办法扩展现有模型,以获得使用flask

  • 我想在3个表中插入记录。代码如下。 地址的密钥是aID,客户的密钥是cID。它们是自动增量。在顾客中,有一个外键受地址的aID约束。HomeCu的外键cID受客户的cID约束。所以我想插入地址,客户,HomeCu顺序,在此期间,我必须得到密钥而不做提交。我使用flush()来获取密钥,但在提交操作中失败。为什么在提交操作中,像电子邮件、密码这样的值变成无,但打印语句做得很好?我已经为此挣扎了几个小

  • 问题内容: 在此表模式中: 我有一个父母,假设这张桌子: 父母是名为“ singapore”* 的 国家 对象。可以有多个嵌套的对象,是孩子们 盛港 随便怎么样都 盛港 是孩子 新加坡 。 *** 因此,一条等级链可能看起来像a-> b->盛港->新加坡 ->意思 是 如何获得所有以父级为新加坡的位置对象,包括父级对象(新加坡)?(请在SQLAlchemy中)。谢谢! 问题答案: SA文档:Que

  • 我们正在尝试从Spring 2.5.2升级到4.0.5. RELEASE,但发现Spring的事务管理不再起作用。 在我们的生产应用程序中,所有数据库操作都通过一个标有@Transactional注释的Spring bean(使用默认设置)。几年来,这一直按预期工作,如果在事务边界内抛出RuntimeException,就会发生回滚。然而,当我们升级到Spring 4.0.5时。释放时,它的作用相