金字塔事务管理器在更新时未提交

2 投票
1 回答
1569 浏览
提问于 2025-04-18 16:59

抱歉之前没有说清楚,

我在使用默认的Pyramid应用程序,搭配SQLAlchemy(后端是PostgreSQL),是通过以下代码生成的:

pcreate -s alchemy

所以我已经设置好了与DBSession、pyramid_tm等相关的所有配置。我有以下这段代码:

class User(Base):
    id = Column(Integer, primary_key=True)
    connection = relationship("UserConnection", uselist=False, backref="user")

class UserConnection(Base):
    userid = Column(Integer, ForeignKey('user.id'), primary_key=True)
    friends = Column(JSON)

def add_connection(user, friend):
    with transaction.manager:
        if not user.connection:
            user_conn = UserConnection(userid=user.id, friends=[])
        else:
            user_conn = user.connection

        user_conn.friends.append(friend)
        print(user_connection.friends)
        session.add(user_conn)

当我第一次运行add_connection()时,用户的连接还不存在。于是就创建了一个新记录,但在下一次运行时(如果进入了else部分),记录却没有更新。在控制台上我只能看到ROLLBACK/COMMIT的消息,没有其他的语句。

那里的打印语句显示了更新后的结果,但数据库并没有更新。

1 个回答

3

你应该在请求的范围内使用事务。

zope.sqlalchemy 和 pyramid_tm 可以帮你做到这一点。

你可以使用我的代码:

pyramid_sqlalchemy.py

# -*- coding: utf-8 -*-

""" Pyramid sqlalchemy lib.

Session will be available as dbsession attribute on request.

! Do not close session on your own.

"""

import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session
from zope.sqlalchemy import ZopeTransactionExtension

Session = scoped_session(sessionmaker(
    extension=ZopeTransactionExtension()
))


def includeme(config):
    """ Setup sqlalchemy session connection for pyramid app.

    :param config: Pyramid configuration

    """
    config.include('pyramid_tm')
    # creates database engine from ini settings passed to pyramid wsgi
    engine = sqlalchemy.engine_from_config(
        config.get_settings(), connect_args={
            'charset': 'utf8'
        }
    )
    # scoped session gives us thread safe session
    Session.configure(bind=engine)
    # make database session available in every request
    config.add_request_method(
        callable=lambda request: Session, name='dbsession', property=True
    )

使用 pip 安装 zope.sqlalchemy 和 pyramid_tm,然后调用 config.include(pyramid_sqlalchemy)。

撰写回答