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?
最佳答案说,在向数据库架构添加字段后,还必须更新模型,但我不知道如何执行此操作,并且无法在文档中找到相关信息。
提前感谢您的帮助。
答案 0 :(得分:0)
我找到了一个解决方案,万一有人将来偶然发现这个问题。
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来说比较新。
答案 1 :(得分:0)
在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>}