玩Flask,Graphene并遇到问题。考虑以下。
Model project.model.site:
from project import db
from project.models import user
from datetime import datetime
class Site(db.Model):
__tablename__ = 'sites'
id = db.Column(db.Integer(), primary_key=True)
owner_id = db.Column(db.Integer, db.ForeignKey('users.id'))
name = db.Column(db.String(50))
desc = db.Column(db.Text())
location_lon = db.Column(db.String(50))
location_lat = db.Column(db.String(50))
creation_date = db.Column(db.DateTime(), default=datetime.utcnow())
users = db.relationship(
user,
backref=db.backref('users',
uselist=True,
cascade='delete,all'))
模型架构(project.schemas.site_schema)
from graphene_sqlalchemy import SQLAlchemyObjectType
from project.models import site as site_model
import graphene
class SiteAttributes:
owner_id = graphene.ID(description="Site owners user.id")
name = graphene.String(description="Site Name")
desc = graphene.String(description="Site description")
location_lon = graphene.String(description="Site Longitude")
location_lat = graphene.String(description="Site Latitude")
creation_date = graphene.DateTime(description="Site Creation Date")
class Site(SQLAlchemyObjectType, SiteAttributes):
"""Site node."""
class Meta:
model = site_model
interfaces = (graphene.relay.Node,)
最后是我计划公开GraphQL api的主要模式(project.schemas.schema))
from graphene_sqlalchemy import SQLAlchemyConnectionField
import graphene
from project.schemas import site_schema, trade_schema, user_schema
class Query(graphene.ObjectType):
"""Query objects for GraphQL API."""
node = graphene.relay.Node.Field()
user = graphene.relay.Node.Field(user_schema.User)
userList = SQLAlchemyConnectionField(user_schema.User)
site = graphene.relay.Node.Field(site_schema.Site)
siteList = SQLAlchemyConnectionField(site_schema.Site)
trade = graphene.relay.Node.Field(trade_schema.Trade)
tradeList = SQLAlchemyConnectionField(trade_schema.Trade)
schema = graphene.Schema(query=Query)
如果我在启动时就这样加载模型,一切都很好。发生迁移后,应用程序运行正常。如果我通过架构加载模型,但是应用程序失败并显示以下消息:
AssertionError: You need to pass a valid SQLAlchemy Model in Site.Meta, received "<module 'project.models.site' from '/vagrant/src/project/models/site.py'>".
我用flask_sqlalchemy初始化了SQLAlchemy。这让我怀疑是不是将创建的模型视为有效的SQLAlchemy模型?还是我在这里做一个基本的错误,而我只是没有看到。我认为是后者。
答案 0 :(得分:2)
根据错误消息,似乎project.models.site
(在第二个片段中以from project.models import site as site_model
导入)是Python模块,而不是db.Model
或类似的子类。您也许是要导入Site
(大写)而不是site
吗?
答案 1 :(得分:0)
因此,将软件包固定到类上最终使我朝着正确的方向发展。事实证明,问题要深得多。唯一的方法就是读取隐藏的异常。
首先,我确保加载的是实际模型,而不是模块。非常感谢你@jwodder
最后,这个https://github.com/graphql-python/graphene-sqlalchemy/issues/121最终指向我正确的方向。通过检查实际的异常消息,我找到了解决方案的方法