【问题标题】:Update database records from data fixtures从数据夹具更新数据库记录
【发布时间】:2013-06-08 10:14:58
【问题描述】:

我如何使用数据夹具(或其他序列化记录)中的记录更新已填充的 Django 数据库

我知道我可以使用 Django data fixtures to provide initial data。我可以使用相同的已编写功能从数据夹具(或类似的序列化数据,如 JSON 文档)更新数据库吗?

“从序列化数据插入或更新”操作应该是idempotent:

  • 如果数据库中不存在记录(按其键),则应插入该记录。
  • 如果数据库中已经存在一条记录(通过其键),则应更新它以匹配数据夹具。
  • 最终状态应该是数据夹具中的所有数据都应该在数据库中更新,无论记录是否已经存在。

具体来说,我可以通过指定pk=null 并使用自然键来更新现有行吗?

我如何使用现有的 Django “加载数据”功能(无论是 loaddata 还是 Django 中的其他类似功能)来读取序列化数据,如果它们不存在则插入记录,如果它们已经存在则更新它们存在

【问题讨论】:

    标签: django django-fixtures


    【解决方案1】:

    是的,您可以使用loaddata

    python3 -m django loaddata path/to/fixture/some_new_data.json
    

    但是:

    • 不要调用你的新数据initial_data.json,否则它会在你每次同步数据库或运行南迁移时重新加载,并且会清除自加载夹具以来所做的任何更改。 (正如 page 中途提到的)
    • 与上述相关,通过夹具加载数据可能是一种脆弱的处理方式,除非您确定在编写夹具时新数据不会到达。如果是这样,您将面临冲突以及数据库中出现故障或“不正确”数据的风险。

    根据您数据的性质,使用data migration in South 可能会更好。当您为大量记录设置几个值时(例如,更改字段的默认值,或用数据填充空白字段),数据迁移可能会很好。数据迁移还允许您通过 Python 对事物应用一些检查/逻辑,以便您可以针对要更新的记录,或以不同的方式更新不同的记录,而不是编写大量的固定装置。但是,如果您想加载大量新记录,那么固定装置会更有意义。

    【讨论】:

    • 我试过了,啊我应该更清楚。我会更新问题。问题是我如何update 现有行?
    • 啊,那个更新填满了我原来的答案 :o) 虽然数据迁移可能仍然更好。你需要做什么样的改变?
    • 抱歉这个含糊的问题。 :( 我有模型 A 和 data_for_A.json。现在我向 A 添加了一个字段,并想为该字段提供初始值。(每行都有不同的初始值)
    • 听起来您可以 a) 手动修改您的夹具并重新加载它,或者 b) 编写数据迁移以智能地设置它们。我会选择 b,但我没有看到你的数据
    • 我不能使用 a) 方法。除了我不知道每行的 pk 。有没有办法使用自然键而不是pk? (我见过仅使用自然键作为外键的示例)
    猜你喜欢
    • 2016-01-15
    • 2018-06-08
    • 1970-01-01
    • 2018-12-10
    • 2021-09-14
    • 2015-09-20
    • 1970-01-01
    • 2010-10-08
    • 2011-08-13
    相关资源
    最近更新 更多