抱歉我之前没说清楚,
编辑: 我正在使用带有 sqlalchemy 的默认 Pyramid 应用程序(后端: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() 时, user.connection 不存在。创建新记录,但在下次运行时(如果转到 else )记录不会更新,在控制台上我只能看到 ROLLBACK/COMMIT 但看不到其他语句。
那里的打印语句显示了更新的结果,但数据库没有更新。
最佳答案
您应该在请求范围内使用事务。
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)
关于python - Pyramid 事务管理器未提交更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25265482/