Python Django:使用一个数据库填充另一个数据库的模型设置
我正在Django(一个家谱)重建一个个人项目,我正在将实际数据从旧数据库迁移到我的新模型/模式,这两个数据库都是Postgres数据库。我在settings.py的DATABASES列表中将它们定义为“default”和“source” 我已经创建了模型,我想将旧数据库中的记录复制到新数据库中相应的表中,但我不太了解如何设置模型使其工作,因为Django代码使用模型/ORM访问/更新/创建对象,我只有反映新模式的模型,而不是旧模式的模型 巧合的是,我在新旧数据库中有一个模式完全相同的表,我有一个管理命令,可以使用我的新ImagePerson模型(Python Django:使用一个数据库填充另一个数据库的模型设置,python,django,dbmigrate,Python,Django,Dbmigrate,我正在Django(一个家谱)重建一个个人项目,我正在将实际数据从旧数据库迁移到我的新模型/模式,这两个数据库都是Postgres数据库。我在settings.py的DATABASES列表中将它们定义为“default”和“source” 我已经创建了模型,我想将旧数据库中的记录复制到新数据库中相应的表中,但我不太了解如何设置模型使其工作,因为Django代码使用模型/ORM访问/更新/创建对象,我只有反映新模式的模型,而不是旧模式的模型 巧合的是,我在新旧数据库中有一个模式完全相同的表,我有一
ported_data=ImagePerson.objects.using('source').all()
)从源抓取旧记录,因为预期的字段是相同的。然后我将它们的对象保存在“default”中:(obj,created\u bool)=ImagePerson.objects。使用(“default”).get\u或\u create(field=fieldvalue等)
,它的工作原理与我需要的一样
但是当我的表中旧版本缺少新模型/表中的字段时,我无法使用该模型访问这些记录(这很有意义)。我是否应该为每个模型制作某种遗留版本,以便在迁移中使用?我看到一个教程提到运行/manage.py inspectdb--database=source>models.py
,但这样做似乎并没有给我的文件添加任何其他内容(而且在其中保存临时/旧模型似乎很奇怪)。访问旧格式记录的正确方法是什么?ORM是对的吗
举一个具体的例子,我有一个Notes表来保存关于某个人或某个家庭的记忆。旧表使用了一个“类型”字段(1用于个人注释,2用于家庭注释),以及一个ref_id,该id将是注释所应用的个人或家庭的id。新表中有一个person\u id字段和一个family\u id字段
我希望我的管理命令能够从源表中提取所有记录,然后如果type=1,查找id等于ref_id字段的person,并与该person一起在新数据库中保存一个新对象。我可以使用新的Notes模型和旧数据库获取它们,如下所示:ported\u Notes=Note.objects.using('source').all()
,但是如果我尝试访问任何字段(如print(Note\u row.body)
),我会得到一个错误,结果对象缺少person\u id字段
django.db.utils.ProgrammingError: column notes.person_id does not exist
正确的方法是什么?为旧模式创建模型显然不是正确的方法 一种解决方案是编写数据迁移,您可以使用原始SQL获取旧数据,然后使用ORW将其写入新表/模型:
from django.db import migrations, connections
def transfer_data(apps, schema_editor):
ModelForNewDB = apps.get_model('yourappname', 'ModelForNewDB')
# Fetch your old data
with connections['my_old_db'].cursor() as cursor:
cursor.execute('select * from some_table')
data = cursor.fetchall()
# Write it to your new models
for datum in data:
# do something with the data / add any
# additional values needed.
ModelForNewDB.objects.create(...)
class Migration(migrations.Migration):
dependencies = [
('yourappname', '0001_initial'),
]
operations = [
migrations.RunPython(transfer_data),
]
然后简单地运行迁移。但有一点需要注意:
如果表之间有foreignkey等,则需要注意迁移的顺序。这可以通过编辑您的
依赖项来完成。您甚至可能需要添加迁移以允许某些外键为空值,然后再添加另一个迁移以更正此问题。是的,这正是我想要做的事情-将尝试并跟进!