【发布时间】: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