【问题标题】:Update model with newly added field/column使用新添加的字段/列更新模型
【发布时间】:2017-12-31 03:41:38
【问题描述】:

Python 应用,使用 peewee 处理 SQLite 数据库。

我有这个模型包含一个字段:

class RepUser(Model):
    user = BigIntegerField()

我使用这样的迁移器更新数据库架构:

new_field = IntegerField(null=True)
migrate(migrator.add_column('repuser', 'abc', new_field))

我希望模型会更新其字段以适应插入的额外字段,但事实并非如此。

例如,这给出了一个 KeyError:

model_instance.abc = 42

目标是能够动态添加和删除字段,并更新模型以便使用它们。

我在这里找到了一个相关的问题:Update existing table/model column/fields?

最佳答案是在向数据库架构添加字段后还必须更新模型,但我不确定如何执行此操作,并且在文档中找不到相关信息。

提前感谢您的帮助。

【问题讨论】:

  • 这是在 Django 中吗?
  • 不,这是一个 python 应用程序。使用 peewee 处理 SQLite 数据库。

标签: python model field migrate peewee


【解决方案1】:

我找到了解决方案,以防将来有人偶然发现。

Field 基类有一个名为 add_to_class 的实例方法,它完全符合我的要求。

所以你可以这样做

new_field = SomeField()
new_field.add_to_class(model_class, 'column_name')

请注意,当您连接到数据库时,您必须获取所有列并将它们手动添加到您的模型库中。我在连接到数据库后立即执行此操作:

for index, column_name in enumerate(database.get_columns('table_name')):
    if (index < 2): # 2 is in my case how many columns I have that are 'static'
        continue
    new_field = SomeField()
    new_field.add_to_class(table_name, column_name)

显然你必须改变细节。

文档 afaik 中没有提及这一点。我确实不得不查看源代码才能找到这种方法。

对不起,如果我的术语有点错误,我对 python 比较陌生。

【讨论】:

【解决方案2】:

在 3.0a 中,您将改用 Model._meta.add_field() 方法:

class User(Model):
    pass

f = TextField()
User._meta.add_field('username', f)

print(User._meta.fields)
# {'id': <peewee.AutoField at 0x7f552815bc50>,
#  'username': <peewee.TextField at 0x7f552b1d7e10>}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2015-08-12
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多