将数据库列复制到Django中的另一个

Posted

技术标签:

【中文标题】将数据库列复制到Django中的另一个【英文标题】:Copy a database column into another in Django 【发布时间】:2017-05-20 22:15:44 【问题描述】:

我正在编写一个迁移,需要我用来自另一个字段(具有相同类型和约束)的现有数据填充一个字段。在 Django 中是否可以在单个操作中复制数据?当我需要复制数据时,目标列已经存在。

在 SQL 中,我会这样写:

UPDATE my_table SET column_b = column_a;

编辑

当前的答案建议循环遍历模型实例,但这是我想要避免的。可以不用循环吗?

【问题讨论】:

可以创建数据迁移Data migrations 【参考方案1】:

正如评论所提到的,您可以简单地为此编写迁移。我认为以下应该可以工作,尽管我还没有测试过。它使用queryset update API and F 来避免循环

from __future__ import unicode_literals

from django.apps import apps
from django.db import migrations, models
from django.db.models import F


def copy_field(app, schema):
    MyModel = apps.get_model('<your app>', 'MyModel')
    MyModel.objects.all().update(column_a=F('column_b'))


class Migration(migrations.Migration):
    dependencies = [
        ('<your app>', '<previous migration>'),
    ]

    operations = [
        migrations.RunPython(copy_field),
    ]

【讨论】:

也许我的问题不够清楚。我确实在写迁移。我的实际问题是:是否可以避免遍历元素来复制值。我知道我可以从 Django 执行原始 SQL,但我想知道是否没有更好的方法。 修改了我的答案以避免循环 我似乎无法在第一个操作中创建一个字段,然后在第二个操作中在copy_field 中使用它。我们不能在一次迁移中创建一个新字段并从另一个字段复制到它吗? 回复我自己:我已经为此创建了两个迁移。但是将旧字段复制到新字段仍然不起作用。我没有得到看起来像update() 中的赋值的表达式。它看起来像是从左到右的作业,将其与原始问题相匹配。我无法让它与我对文档的解释一起工作。 小更新。 copy_field 需要两个显式参数,所以更多:def copy_field(app, schema): :)

以上是关于将数据库列复制到Django中的另一个的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:将列数据值从一个表复制到同一数据库中的另一个表

SQL Server - 将表中的某些列镜像到同一服务器上的另一个数据库,无需复制

如何并行化将矩阵的行随机复制到内存中的另一个矩阵的过程? [复制]

Liquibase:将值从一列复制到具有数组数据类型的另一列

通过传输功能将数据从一个项目复制到 BQ 中的另一个项目是不是需要成本?

使用spring boot将大量数据从一个集合复制到Mongodb中的另一个集合