当在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": [
]
}
我已经在这个问题上苦苦挣扎了几个小时,关于嵌套字段为什么不显示任何数据的任何输入将受到极大的赞赏。谢谢!
答案 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
但是,我仍然不确定这是否会引起一些问题,因为这不是处理会话的正确方法……必须继续阅读文档。