You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Node.js的PostgreSQL数据库向Django进行数据迁移?

问题核心说明

Node.js侧的数据库没有对应的Django模型,get_model()只能查找Django项目中已注册应用的模型,因此无法直接用它获取Node侧的数据。以下是两种可行的解决方案:


方案一:直接使用原生数据库查询

无需创建模型,通过Django的数据库连接执行原生SQL查询,直接读取Node.js数据库的数据:

修改你的迁移代码如下:

from django.db import connections

class Migration(migrations.Migration):

    def migrate_items(self, schema_editor):
        # 获取指定数据库的连接游标
        with connections['inventory'].cursor() as cursor:
            # 执行原生SQL,替换为Node侧实际的表名
            cursor.execute("SELECT * FROM inventory_item;")
            # 将查询结果转为字典格式,方便后续字段映射
            columns = [col[0] for col in cursor.description]
            items = [dict(zip(columns, row)) for row in cursor.fetchall()]
            
            # 遍历数据并导入到Django的目标模型
            from items.models import Item
            for item in items:
                Item.objects.create(
                    name=item['name'],
                    price=item['price'],
                    # 根据实际字段完成映射
                )
        print("数据迁移完成")

    def reverse_migrate_items(self, schema_editor):
        # 按需实现反向迁移逻辑(可选)
        pass

    dependencies = [
        ('items', '0022_merge_0020_alter_history_event_0021_alter_assign_item'),
    ]

    operations = [
        migrations.RunPython(migrate_items, reverse_code=reverse_migrate_items)
    ]

注意点:

  • 替换SELECT * FROM inventory_item;中的表名为Node.js数据库中实际的表名
  • 根据新旧模型的字段对应关系,调整Item.objects.create()中的字段映射逻辑

方案二:生成临时模型(适合复杂表结构)

如果Node侧的表结构复杂,原生SQL处理繁琐,可以用Django的inspectdb工具生成对应表的临时模型:

  1. 生成临时模型文件:
    先创建temp_inventory目录并添加__init__.py作为临时应用,再执行命令:
python manage.py inspectdb --database=inventory > temp_inventory/models.py
  1. 注册临时应用:
    在settings.py的INSTALLED_APPS中添加临时应用:
INSTALLED_APPS = [
    # ...其他已注册应用
    'temp_inventory',
]
  1. 在迁移中使用临时模型:
class Migration(migrations.Migration):

    def migrate_items(self, schema_editor):
        # 导入临时生成的旧模型
        from temp_inventory.models import Item as OldItem
        # 指定数据库查询Node侧数据
        old_items = OldItem.objects.using('inventory').all()
        
        # 导入到Django新模型
        from items.models import Item
        for old_item in old_items:
            Item.objects.create(
                name=old_item.name,
                price=old_item.price,
                # 完成字段映射
            )

    def reverse_migrate_items(self, schema_editor):
        pass

    dependencies = [
        ('items', '0022_merge_0020_alter_history_event_0021_alter_assign_item'),
    ]

    operations = [
        migrations.RunPython(migrate_items, reverse_code=reverse_migrate_items)
    ]

注意点:

  • 迁移完成后,可删除temp_inventory目录并从INSTALLED_APPS中移除该应用
  • 生成的模型可能需要手动调整字段类型(例如自动生成的AutoField可能需改为IntegerField,根据实际表结构调整)

内容的提问来源于stack exchange,提问作者miloshIra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:20:35