发行
最近我遇到一个客户的问题,有很多解决方案,但都不容易。此应用程序使用Postgresql数据库,有两种环境:dev
和prod
。
在某种程度上,有人认为从module_people_new
中删除其中一个表(prod
)是一个好主意,而不考虑FK和它可能携带的其他问题。幸运的是,它是一个模块,没有很好地与应用程序耦合,所以应用程序保持正常工作。
当我开始使用这个应用程序时,一些函数由于完整性错误而失败,所以我发现是因为这个原因。我在dev
中尝试了相同的功能,看到它们在工作,所以桌子就在那里。
Postgresql表说明
现在,我想知道是否有办法从prod
中的信息中“恢复”该表。我知道我可以从那里获取表描述并构建一个create查询,但我想知道是否有更“直接”的方法。关于表格说明,我的意思是:
db-> \d+ module_people_new
Table "public.module_people_new"
Column | Type | Modifiers | Storage | Stats target | Description
---------------------------+--------------------------+-----------+----------+--------------+-------------
id | integer | not null | plain | |
created_at | timestamp with time zone | not null | plain | |
updated_at | timestamp with time zone | not null | plain | |
first_name | character varying(255) | not null | extended | |
last_name | character varying(255) | not null | extended | |
user_id | integer | not null | plain | |
. . .
Indexes:
"module_people_pkey" PRIMARY KEY, btree (id)
. . .
Check constraints:
. . .
Foreign-key constraints:
"module_user_id_4d9d48da00e81837_fk_module_user_id" FOREIGN KEY (user_id) REFERENCES module_user(id) DEFERRABLE INITIALLY DEFERRED
. . .
另一种可能性
该应用程序是一个Django应用程序,所以我也有迁移,但恐怕有一些更改可能影响了该表和其他相关的表。但是,也许我可以用这个。唯一的问题是我不想复制粘贴迁移并简单地应用它,交叉手指并希望它能工作。我知道您可以从Django ORM查询中获取SQL查询,也许还有一种方法可以从迁移中获取查询?
非常感谢:)
最佳答案
我可以想到的一种可能性是使用inspectdb检查dev中的表并将其输出到模型中。
python manage.py inspectdb module_people_new > models.py
然后生成迁移并在生产环境中创建表。然后,您可以创建一个脚本来重新填充该表,如下所示:
# some_script.py
from some_app.models import User
# assuming `module_people_new` table's Model Name is ModulePeople
for user in User.objects.all():
ModulePeople.objects.get_or_create(user=user, first_name=user.first_name, ...)
然后像这样使用脚本:
python manage.py shell < some_script.py
或者如果您想直接从dev从数据库填充数据,那么可以使用fixtures。您可以从dev中dumpdata并在生产中使用loaddata。