发行
最近我遇到一个客户的问题,有很多解决方案,但都不容易。此应用程序使用Postgresql数据库,有两种环境:devprod
在某种程度上,有人认为从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

09-30 13:06
查看更多