【问题标题】:How to update DB when field changed in mongoalchemy.(flask)?mongoalchemy.(flask)中字段更改时如何更新数据库?
【发布时间】:2020-05-31 12:10:35
【问题描述】:

我正在使用flask-mongoalchemy做一个演示,这里有个问题让我困惑了一段时间。 一开始我创建了一个用户类

class Student(db.Document):
    '''student info'''
    name = db.StringField()
    grade = db.IntField(required=False, default=None)

然后,我用这个数据库创建了一些例子,比如student1,student2……等等。 现在,我将 Grade 的默认值从 None 更改为 0

grade = db.IntField(required=False, default=0)

当我再次运行查询时,它会引发错误:

mongoalchemy.exceptions.BadValueException: Bad value for field of type "grade".  Reason: "Value is not an instance of <class 'int'>

SO,如何自动更新此字段更改?我现在所做的是手动修改数据库中年龄的值。

【问题讨论】:

  • 您可以手动删除student 集合并重新构建吗?或者在 mongo shell 中运行更新查询来设置grade=0
  • @Valijon 更新操作可以改变表默认值吗?
  • 如果表格符合要求可以更改。在您的情况下,也许一旦您创建了 student 集合,MongoDB 就会创建 $jsonSchema 进行验证。检查它:db.getCollectionInfos({name: "student"})

标签: mongodb flask flask-sqlalchemy pymongo mongoalchemy


【解决方案1】:

首先,要使查询像以前一样工作,请将字段上的allow_none option 设置为True

grade = db.IntField(required=False, default=0, allow_none=True)

这应该允许没有评分值的文档在展开为 python 对象时不会触发错误。

接下来,进行迁移,将等级为 None 的文档的默认值设置为 0。

from mongoalchemy.session import Session

with Session.connect('mongoalchemy') as s:
    update = s.query(Student).filter(Student.grade == None).set(User.grade, 0)
    update.execute()

最后,将字段声明切换回以禁止等级的None 值。

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多