Python 3.x 我无法使用SQLAchemy+;将行保存到数据库;金字塔

Python 3.x 我无法使用SQLAchemy+;将行保存到数据库;金字塔,python-3.x,sqlalchemy,pyramid,Python 3.x,Sqlalchemy,Pyramid,经过数小时的调试,由于我的组织没有太多的Python专业知识,我向这个社区寻求帮助 我试图遵循将一些数据提交到数据库的目标。虽然没有报告错误,但我也没有保存任何行。我做错了什么 尝试使用db2Session提交时,我得到: 必须使用事务管理器提交事务 但是在教程中,我没有看到使用事务管理器。我以为这个经理一定会使用zope.sqlalchemy?然而,除此之外,一切都没有发生。如果您能再次提供帮助,我们将不胜感激 我在金字塔应用程序的主功能中有以下设置: from sqlalchemy impo

经过数小时的调试,由于我的组织没有太多的Python专业知识,我向这个社区寻求帮助

我试图遵循将一些数据提交到数据库的目标。虽然没有报告错误,但我也没有保存任何行。我做错了什么

尝试使用db2Session提交时,我得到:

必须使用事务管理器提交事务

但是在教程中,我没有看到使用事务管理器。我以为这个经理一定会使用zope.sqlalchemy?然而,除此之外,一切都没有发生。如果您能再次提供帮助,我们将不胜感激

我在金字塔应用程序的主功能中有以下设置:

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

上面的评论很好。我只是想在这里总结一下

事务管理器由pyramid_tm启动/提交/中止。如果你没有使用它,那么很可能就是问题所在


您还将挤压可能的数据库异常,这些异常需要传递给事务管理器。您可以通过异常处理程序中的
transaction.abort()
执行此操作。

如果您在链接的页面中搜索“transaction”,则会有一行使用transaction manager:
和transaction.manager:
。就个人而言,我避免使用这种复杂的全局或伪全局。我更喜欢创建自己的
会话
每个请求。您是否使用了每个请求事务管理包?如果没有,那么你就没有做出任何承诺。您也可以像前一篇文章中所指出的那样显式使用事务管理器。哦,如果确实添加了事务管理器,请记住在捕获所有事务时,在异常处理程序中手动执行
transaction.doom()
transaction.abort()