如何从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工具生成对应表的临时模型:
- 生成临时模型文件:
先创建temp_inventory目录并添加__init__.py作为临时应用,再执行命令:
python manage.py inspectdb --database=inventory > temp_inventory/models.py
- 注册临时应用:
在settings.py的INSTALLED_APPS中添加临时应用:
INSTALLED_APPS = [ # ...其他已注册应用 'temp_inventory', ]
- 在迁移中使用临时模型:
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
相关产品推荐
相关产品推荐

