【问题标题】:Sqlalchemy-Marshmallow - Nested field not displaying any dataSqlalchemy-Marshmallow - 嵌套字段不显示任何数据
【发布时间】:2023-04-07 02:36:01
【问题描述】:

在使用 marshmallow-sqlalchemy 和 Flask-SQLAlchemy 时,在我的烧瓶应用程序中使用嵌套字段没有问题。现在我已经从 Flask-SQLAlchemy 切换到 SQLAlchemy(出于一些不相关的原因),我的嵌套字段不再显示任何数据。我觉得这可能与 SQLAlchemy Session 未传递到嵌套字段有关。

我的项目如下所示:

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": [

]
}

我已经在这个问题上苦苦挣扎了几个小时,并且非常感谢任何关于为什么嵌套字段不显示任何数据的输入。谢谢!

【问题讨论】:

    标签: sqlalchemy marshmallow


    【解决方案1】:

    我没有最近使用 SQLAlchemy 的经​​验,但可能会检查你所有的序列化/转储方法,以确保一切都知道如何编写自己。我不清楚情节可以。

    否则,我会从这里开始:

    • 您的数据库存在吗?
    • 您的配置是否仍然正确指向它?
    • 您是否运行了所有数据库设置?
    • 是否所有内容都已添加并提交到您的会话中?
    • 是否只有剧集列表未填写?
    • 您应该只获得一个播客列表吗?
    • 包含剧集数据的文件中是否存在拼写错误 还是播客数据?
    • 如果某些要求(pip 安装)发生更改而不 烧瓶(注意大小写)?

    • 您是否获得了最新的 sqlalchemy?你检查过更新日志吗(它做了一些不同的连接等等)

    我很老的例子有

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

    元数据是否相关?

    (我是通过你的工作帖子来到这里的,我很好奇 - 不确定这是否有助于解开你的束缚)。祝你好运。

    【讨论】:

    • 安,谢谢你的详细回复。下次遇到问题时,我将使用所有这些要点进行诊断!我确定这个问题与我如何处理每个单独模型的会话有关。因为我没有为每个模型使用范围会话,所以我猜会话从未传递给每个嵌套字段,因此是空的数据数组。
    【解决方案2】:

    我最终通过将我的 db 文件从上面更改为 - 来让嵌套字段工作 -

    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    
    

    但是,我仍然不确定这是否会导致一些问题,因为这不是处理会话的正确方法...必须继续阅读文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      相关资源
      最近更新 更多