缺少药剂参数时出错。Python、Flask、Graphql

缺少药剂参数时出错。Python、Flask、Graphql,python,flask,graphql,Python,Flask,Graphql,在创建用户时添加附加字段“datetime”时遇到问题。尽管CreateUser类中的设置required=False,但我自己尝试了大约一个小时来解决这个问题,但没有成功。放弃的感觉开始出现,所以我来这里寻求帮助 from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_graphql import GraphQLView import graphene from graphene_sqlalchemy

在创建用户时添加附加字段“datetime”时遇到问题。尽管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
  }
}

好吧,多亏了@Doobeh,我成功地解决了这个问题。问题是我在调用db.create_all()后添加了“join”,因此join没有成为我数据库中的一列


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

您已经将
mutate
定义为需要连接的-也许可以尝试为其提供默认值
def mutate(self,info,username,email,password,joined=None)
因此它是可选的,而不是必需的。谢谢@Doobeh的回复。遗憾的是,这并没有做到这一点,但我还是抱有希望。它似乎解决了最初的问题——现在它似乎报告了该列不在表中——您是否验证了sqlite数据库已创建/具有您期望的所有列?可能就是这样。现在正在约会,所以不能测试它。我可以尝试删除数据库并使用所有表正确地重新创建它@杜贝