将数据库列复制到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:将值从一列复制到具有数组数据类型的另一列