Sqlalchemy-Marshmallow - вложенное поле, не отображающее никаких данных - PullRequest
0 голосов
/ 03 апреля 2019

У меня не было проблем с использованием вложенных полей в моем приложении фляги при использовании зефира-sqlalchemy с Flask-SQLAlchemy.Теперь, когда я переключился с Flask-SQLAlchemy на просто SQLAlchemy (по нескольким не относящимся к делу причинам), мои вложенные поля больше не отображают никаких данных.Мне кажется, что это может быть связано с тем, что сеанс SQLAlchemy не передается во вложенные поля.

Мой проект выглядит следующим образом:

engine = create_engine(config.SQLALCHEMY_DATABASE_URI, echo=True)
Session = orm.scoped_session(orm.sessionmaker())
Session.configure(bind=engine)    
Base = declarative_base(bind=engine)

class PodcastModel(Base):
    __tablename__ = 'podcasts'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    host = db.Column(db.String(80))
    episodes = relationship(EpisodeModel, backref='episode', lazy='dynamic')

    @classmethod
    def dump(cls, podcast):
        podcast_schema = PodcastSchemaNested()
        podcast_output = podcast_schema.dump(podcast).data
        return podcast_output

class EpisodeModel(Base):
    __tablename__ = 'episodes'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(200))
    length = db.Column(db.Float(precision=2))    
    podcast_id = db.Column(db.Integer, db.ForeignKey('podcasts.id', ondelete='CASCADE'))

class BaseSchema(ModelSchema):
    class Meta:
        sqla_session = Session
        ordered = True 

class PodcastSchemaNested(BaseSchema):
    id = fields.Integer()
    name = fields.Str()
    host = fields.Str()
    episodes = fields.Nested('EpisodeSchema', many=True)

class EpisodeSchema(BaseSchema):
    id = fields.Integer()
    name = fields.Str() 
    length = fields.Float()

И вывод json следующий:

{
"id": 1,
"name": "Podcast Name",
"host": "Podcast Host",
"episodes": [

]
}

Я боролся с этой проблемой в течение нескольких часовсейчас и любой вклад в то, почему во вложенных полях не отображаются какие-либо данные, был бы очень важен.Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

В итоге я заставил работать вложенные поля, изменив мой файл базы данных с вышеупомянутого на -

from common import config
import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker, relationship, backref


engine = db.create_engine(config.SQLALCHEMY_DATABASE_URI, echo=True)
session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()

И на моих модельных методах, где я получаю доступ и запрашиваю базу данных вместо -

@classmethod
def find_by_name(cls, name):
    session = Session()
    episode = session.query(cls).filter_by(name=name).first()  
    session.close()
    return episode       

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

from common.db.base import Base, session

@classmethod
def find_by_name(cls, name):
    episode = session.query(cls).filter_by(name=name).first()  
    return episode    

Тем не менее, я все еще не уверен, не вызовет ли это некоторые проблемы из-за того, что он не является подходящим способом обработки сеансов ... Должен продолжать читать документы.

0 голосов
/ 03 апреля 2019

У меня нет недавнего опыта работы с SQLAlchemy, но, возможно, проверьте все ваши методы сериализации / дампа, чтобы убедиться, что все знают, как писать сами. Мне не ясно, что Эпизоды могут.

В противном случае, вот где я бы начал:

  • Ваша база данных существует?
  • Ваш конфиг все еще указывает на него правильно?
  • Запустили ли вы все настройки базы данных?
  • Все ли добавлено и зафиксировано в вашем сеансе?
  • Это только список эпизодов, который не заполняется?
  • Если вы получаете только один список подкастов?
  • Есть ли в файле опечатка, содержащая данные эпизода или данные подкаста?
  • Если некоторые требования (установки pip) изменятся без колба (следите за заглавными буквами)?

  • Вы получили последнюю версию sqlalchemy? Вы проверили журнал изменений (некоторые соединения по-разному и т.д.)

Мои очень старые примеры имеют

Base = declarative_base()
Base.metadata.bind=engine

Актуальны ли метаданные?

(Я пришел сюда через ваш пост, и мне было любопытно - не уверен, поможет ли это вообще вам отцепить). Удачи.

...