Sqlalchemy-棉花糖-嵌套字段不显示任何数据

时间:2019-04-02 23:12:07

标签: sqlalchemy marshmallow

当在Flask-SQLAlchemy中使用棉花糖-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": [

]
}

我已经在这个问题上苦苦挣扎了几个小时,关于嵌套字段为什么不显示任何数据的任何输入将受到极大的赞赏。谢谢!

2 个答案:

答案 0 :(得分:0)

我没有SQLAlchemy的最新经验,但是也许检查所有序列化/转储方法以确保所有内容都知道如何编写自己。我不清楚插曲能否做到。

否则,这就是我要开始的地方:

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

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

我的旧示例有

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

元数据是否相关?

(我是通过您的忙碌帖子来到这里的,我很好奇-不确定对您的帮助是否有任何帮助)。祝你好运。

答案 1 :(得分:0)

我最终通过将数据库文件从上述更改为-来使嵌套字段起作用-

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    

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