【发布时间】:2017-07-06 10:32:20
【问题描述】:
经过数小时的调试,并且由于我的组织没有很多 Python 专业知识,我正在向这个社区寻求帮助。
我正在尝试关注this tutorial,目标是向数据库提交一些数据。虽然没有报告错误,但我也没有保存任何行。我做错了什么?
当尝试使用 db2Session 提交时,我得到:
事务必须使用事务管理器提交。
但在本教程中,我没有看到正在使用事务管理器。我认为这个经理是使用 zope.sqlalchemy 绑定的?然而,除此之外什么都没有发生。再次提供帮助将不胜感激!
我在 Pyramid 应用程序的主要功能中有以下设置:
from sqlalchemy import engine_from_config
from .models import db1Session, db2Session
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
db1_engine = engine_from_config(settings, 'db1.')
db2_engine = engine_from_config(settings, 'db2.')
db1Session.configure(bind=db1_engine)
db2Session.configure(bind=db2_engine)
在 .models/__init__py 中,我有:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (scoped_session, sessionmaker)
from zope.sqlalchemy import ZopeTransactionExtension
db1Session = scoped_session(sessionmaker(
extension=ZopeTransactionExtension()))
db2Session =
scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()
在 ./model/db2.py 我有:
class PlateWellResult(Base):
__tablename__ = 'SomeTable'
__table_args__ = {"schema": 'some_schema'}
id = Column("ID", Integer, primary_key=True)
plate_id = Column("PlateID", Integer)
hit_group_id = Column("HitID", Integer, ForeignKey(
'some_schema.HitGroupID.ID'))
well_loc = Column("WellLocation", String)
我的保存功能的相关位如下所示。 ./lib/db2_api.py:
def save_selected_rows(input_data, selected_rows, hit_group_id):
""" Wrapper method for saving selected rows """
# Assume I have all the right data below.
new_hit_row = PlateWellResult(
plate_id=master_plate_id,
hit_group_id=hit_group_id,
well_loc=selected_df_row.masterWellLocation)
db1Session.add(new_hit_row)
# When I try the row below:
# db2Session.commit()
# I get: Transaction must be committed using the transaction manager
# If I cancel the line above, nothing gets committed.
return 'Save successful.'
从我的查看器调用该函数:
@view_config(route_name='some_routename', renderer='json',
permission='create_hit_group')
def save_to_hitgroup(self):
""" Backend to AJAX call to save selected rows to a hit_group """
try:
# Assume that all values were checked and all the right
# parameters are passed
status = save_selected_rows(some_result,
selected_rows_list,
hitgroup_id)
json_resp = json.dumps({'errors': [],
'status': status})
return json_resp
except Exception as e:
json_resp = json.dumps({'errors': ['Error during saving. {'
'0}'.format(e)],
'status': []})
return json_resp
【问题讨论】:
-
如果您在链接的页面中搜索“事务”,有一行使用事务管理器:
with transaction.manager:。就个人而言,我避免使用这种复杂的全局变量或伪全局变量。我很高兴为每个请求创建自己的Session。 -
你用过per request事务管理包
pyramid_tm吗?如果没有,那么你没有提交任何东西。您也可以像上一篇文章中指出的那样显式使用事务管理器。 -
哦,如果您确实添加了它,请记住在捕获它们时在异常处理程序中手动
transaction.doom()或transaction.abort()。
标签: python-3.x sqlalchemy pyramid