【问题标题】:Error missing potitional argument. Python, Flask, Graphql缺少潜在参数时出错。 Python、烧瓶、Graphql
【发布时间】:2020-02-15 13:48:34
【问题描述】:

在创建用户时添加附加字段“日期时间”时遇到问题。尽管在 CreateUser 突变类中设置了 required=False,但我尝试自己解决这个问题大约一个小时,但没有成功。放弃的感觉开始出现,所以我在这里寻求帮助。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_graphql import GraphQLView
import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType, SQLAlchemyConnectionField
import bcrypt

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)


# Models
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)
    joined = db.Column(db.DateTime, index=False, unique=False, nullable=False)

    def __repr__(self):
        return f'User("{self.username}" "{self.email}") "{self.password}")'


# Schema Objects
class UserObject(SQLAlchemyObjectType):
    class Meta:
        model = User
        interfaces = (graphene.relay.Node,)


class CreateUser(graphene.Mutation):
    class Arguments:
        username = graphene.String(required=True)
        email = graphene.String(required=True)
        password = graphene.String(required=True)
        joined = graphene.DateTime(required=False)

    user = graphene.Field(lambda: UserObject)

    def mutate(self, info, username, email, password, joined):
        password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
        user = User(username=username, email=email, password=password, joined=joined)

        db.session.add(user)
        db.session.commit()
        return CreateUser(user=user)


class Mutation(graphene.ObjectType):
    create_user = CreateUser.Field()


class Query(graphene.ObjectType):
    all_users = SQLAlchemyConnectionField(UserObject)


schema = graphene.Schema(query=Query, mutation=Mutation)

app.add_url_rule(
    '/graphql',
    view_func=GraphQLView.as_view(
        'graphql',
        schema=schema,
        graphiql=True
    )
)

if __name__ == '__main__':
    app.run()

错误:

    {
  "errors": [
    {
      "message": "(sqlite3.OperationalError) table user has no column named joined\n[SQL: INSERT INTO user (username, email, password, joined) VALUES (?, ?, ?, ?)]\n[parameters: ('Johannes', 'jns@dmo.no', b'$2b$12$H/E3gfKnuidoC70zgLBoUeQRtm4zRApZ7N/xplAtxFXk.fglpqJQi', '2019-10-18 17:53:11')]\n(Background on this error at: http://sqlalche.me/e/e3q8)",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createUser"
      ]
    }
  ],
  "data": {
    "createUser": null
  }
}

【问题讨论】:

  • 您已将mutate 定义为需要加入——也许尝试给它一个默认值? def mutate(self, info, username, email, password, joined=None) 所以它是可选的而不是必需的。
  • 感谢@Doobeh 的回复。可悲的是,这并没有做到,但我确实有希望。
  • 看起来它解决了最初的问题——现在它似乎报告该列不在表中——您是否验证过 sqlite 数据库已创建/具有您的所有列期待吗?
  • 可能就是这样。在一个日期现在所以不能测试它。我可以尝试删除数据库并使用所有表正确创建它。 @Doobeh

标签: python flask graphql


【解决方案1】:

好的,感谢与@Doobeh 的来回交流,我设法解决了这个问题。问题是我在调用 db.create_all() 之后添加了“joined”,因此 join 没有成为我的 db 中的列。

所以解决方案是在删除我的测试数据库后重新运行 db.create_all()。

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 2021-06-07
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多