SQLAlchemy-Continuum и Pyramid: UnboundExecutionError

У меня есть приложение Pyramid, которое делает CRUD с SQLAlchemy через pyramid_basemodel. Кажется, все работает хорошо.

Затем я установил SQLAlchemy-Continuum, чтобы предоставить историю для определенных объектов. Все, что я сделал для его настройки, это сделал следующие изменения в моем файле models.py:

import sqlalchemy as sa
from sqlalchemy import (event, Column, Index, Integer, Text, String, Date, DateTime, \
    Float, ForeignKey, Table, Boolean,)
from sqlalchemy.orm import (relationship, backref, mapper, scoped_session, sessionmaker,)

from pyramid_basemodel import Base, BaseMixin, Session, save
from pyramid_fullauth.models import User
from sqlalchemy_continuum import make_versioned

from colanderalchemy import setup_schema
from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
event.listen(mapper, 'mapper_configured', setup_schema)

# Continuum setup
make_versioned()

# FOR EACH VERSIONED MODEL I ADD __versioned__ = {} at the start of each model def. Eg:
class Thing(Base):
    __versioned__ = {}
    __tablename__ = 'thing'
    id = sa.Column(Integer, primary_key=True)
    related_id = sa.Column(Integer, ForeignKey('OtherThing.id'))
    other_thing = sa.orm.relationship("OtherThing", backref="thing")
    description = sa.Column(String(length=100))
    a_date = sa.Column(Date)
    some_hours = sa.Column(Integer)
    b_date = sa.Column(Date)
    more_hours = sa.Column(Integer)


sa.orm.configure_mappers()

(Извините за слегка избыточный импорт; я решил полностью следовать примеру Continuum и import sqlalchemy as sa и переключитесь на использование этой записи в моделях, которые я версионировал. Возможно, я также делаю глупые, обезьяньи-обезьяньи вещи, основанные на полупонимании различных уроков.)

Эта настройка позволила мне запустить alembic revision --autogenerate и создавать таблицы ModelHistory в базе данных, но когда я перехожу на некоторые страницы, которые читают обновленные модели, они выдают ошибку

sqlalchemy.exc.UnboundExecutionError: This session is not bound to a single Engine or Connection, and no context was provided to locate a binding.

По какой-то причине он читает одну модель, добавленную таким же образом, но затем попытка его обновления завершается с той же ошибкой.

Я предполагаю, что мне нужно настроить все, что Continuum использует для сеанса SQLAlchemy, чтобы указать на существующий, настроенный в Pyramid, но я не уверен. Я греюсь?

2 ответа

Решение

Вы генерируете сеанс, когда звоните:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

но не привязывать его к двигателю. Ваш шаблон пирамиды, pyramid_basemodel, уже генерирует для вас сеанс и привязывает его к движку.

Попробуйте удалить DBSession и использовать Session, импортированный из pyramid_basemodel.

FWIW, если кто-то в наши дни ищет, как заставить SQLAlchemy-Continuum работать с Pyramid, вот как вы это делаете:

Предполагая, что вы следовали официальному руководству Pyramid, оно выглядит следующим образом:

  • установитьSQLAlchemy-Continuum
  • добавлять make_versioned(user_cls=None)к вершинеmodels/__init__.py
  • добавлять__versioned__ = {}кMyModelкласс вmodels/mymodel.py

Вот и все!

Я создал репо, в котором есть все необходимые биты: https://github.com/zupo/tutorial/tree/exploration/sqlalchemy-continuum.

Другие вопросы по тегам