簡體   English   中英

Graphene_sqlalchemy和flask-sqlalchemy在什么構成有效SQLAlchemy模型上存在分歧。

[英]Graphene_sqlalchemy and flask-sqlalchemy disagree on what constitutes a Valid SQLAlchemy Model?

玩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模型? 還是我在這里做一個基本的錯誤,而我只是沒有看到。 我認為是后者。

根據錯誤消息,似乎project.models.site (在第二個片段中from project.models import site as site_model )是Python模塊,而不是db.Model或類似的子類。 您也許是要導入Site (大寫)而不是site

因此,將軟件包固定到類上最終使我朝着正確的方向發展。 事實證明,問題要深得多。 唯一的方法就是讀取隱藏的異常。

首先,我確保加載的是實際模型,而不是模塊。 非常感謝你@jwodder

最后,這個https://github.com/graphql-python/graphene-sqlalchemy/issues/121最終指向正確的方向。 通過檢查實際的異常消息,我找到了解決方案的方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM