在这个问题上,我没有找到大量的指导--当我找到指导时,就没有什么可以解释我遇到的一些问题了。我正在自学Python和Django,这很好,但是部署到服务器is...hell上。如果有一个具有防弹工作流的人来备份Django DB并恢复到服务器,那就太好了。关于虚拟环境,迁移,-假和-initial。
为了我自己--也为了任何人阅读--我将仔细研究我所做的事情,看看我是否能看到错误的所在--因为我正处于“砖墙”阶段。
问题
“它在我的机器上工作”几乎可以准确地概括我所处的位置。效果很好。在我的机器上。
我设法将数据库(Postgresql)还原到我的服务器-- Python。我的Django服务器实例正在与数据库对话,并提供了一些数据。但是,仍然存在一些迁移问题,并最终导致某些表不存在的一些致命错误--如下所示:
Column podcast_show.type does not exist
LINE 1: SELECT "podcast_show"."id", "podcast_show"."type", "podcast_...运行makemigrations /迁移会给我带来类似这样的错误
django.db.utils.IntegrityError: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, curate, 0005_item_tags, 2019-04-29 12:38:32.000168+00).环境
我在窗户上,在Atom上进行本地开发。我有一个安装了Django 2.1的虚拟环境。我正在使用GIT进行版本控制(我只是了解了这一点),我已经安装了一些pypy安装的django应用程序(在virtualENV中),考虑到这一点,我已经对其进行了直接的更改。
这是我第一个“啊哈”的时刻,我以为我已经破解了。我对myLocalVirtualEnv中的pypy包所做的更改(包括模型)没有包含在我的GIT中,它被推到服务器上。因此,当我在服务器上安装了来自requirements.txt的所有依赖项时,我已经得到了这些应用程序的新安装,而不是它们的修改版本。
*问题1)避免这种情况的合适工作流是什么?*一旦开始修改pypy包(它是一个依赖项),是否应该将它从虚拟环境中移出,进入我的标准django文件夹结构,并将其作为我自己的应用程序来处理呢?
后援
这似乎是很容易的。我在本地机器上使用了pgAdmin4 --右击、备份、选择一个输出,然后关闭它。我正在现场直播-从我的本地工作项目。
好了。我现在有一个大的DB(3GB未压缩-这是巨大的吗?)数据库文件'appBU‘。现在我使用SFTP(filezilla)将该文件发送到我的服务器,并将其放在与我的顶级应用程序级别相同的目录中。home/user/App/app
现在,在postgresql控制台中,我创建了一个新数据库。
CREATE DATABASE app;然后我为数据库做了一个用户。我并不总是这样做,如果我已经删除了数据库并再次尝试备份,我只是使用预先存在的用户。在这种情况下,我运行命令DATABASE应用程序;然后是应用程序;因此,我准备好了要还原的新数据库。总之,用户:
CREATE USER username WITH PASSWORD 'password';
ALTER ROLE username WITH PASSWORD client_encoding TO 'utf8';
ALTER ROLE username SET default_transaction_isolation TO 'read committed';
ALTER ROLE username SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE app TO username;现在,我将数据库还原到我刚刚创建的新创建的空数据库中--这是来自bash控制台(不是psql控制台),它需要一段时间才能完成!)
pg_restore -h the-host-address-for-my-postgresql-database -p 11111 -U super -W -C app < appBU这就是问题开始的地方,因为pg_restore不断地感到不开心,因为这些都是我遇到的错误:
pg_restore: [archiver (db)] Error from TOC entry 3347; 0 0 SEQUENCE SET django_comment_flags_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.django_comment_flags_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.django_comment_flags_id_seq...
^
Command was: SELECT pg_catalog.setval('public.django_comment_flags_id_seq', 1, false);
pg_restore: [archiver (db)] Error from TOC entry 3348; 0 0 SEQUENCE SET django_comments_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.django_comments_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.django_comments_id_seq', 17...
^
Command was: SELECT pg_catalog.setval('public.django_comments_id_seq', 17, true);
pg_restore: [archiver (db)] Error from TOC entry 3349; 0 0 SEQUENCE SET django_content_type_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.django_content_type_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.django_content_type_id_seq'...
^
Command was: SELECT pg_catalog.setval('public.django_content_type_id_seq', 22, true);
pg_restore: [archiver (db)] Error from TOC entry 3350; 0 0 SEQUENCE SET django_migrations_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.django_migrations_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.django_migrations_id_seq', ...
^
Command was: SELECT pg_catalog.setval('public.django_migrations_id_seq', 108, true);
pg_restore: [archiver (db)] Error from TOC entry 3351; 0 0 SEQUENCE SET django_site_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.django_site_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.django_site_id_seq', 1, tru...
^
pg_restore: [archiver (db)] Error from TOC entry 3352; 0 0 SEQUENCE SET podcast_category_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_category_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_category_id_seq', 1...
^
Command was: SELECT pg_catalog.setval('public.podcast_category_id_seq', 1098, true);
pg_restore: [archiver (db)] Error from TOC entry 3353; 0 0 SEQUENCE SET podcast_enclosure_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_enclosure_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_enclosure_id_seq', ...
^
Command was: SELECT pg_catalog.setval('public.podcast_enclosure_id_seq', 1, false);
pg_restore: [archiver (db)] Error from TOC entry 3354; 0 0 SEQUENCE SET podcast_episode_guests_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_episode_guests_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_episode_guests_id_s...
^
Command was: SELECT pg_catalog.setval('public.podcast_episode_guests_id_seq', 1, false);
pg_restore: [archiver (db)] Error from TOC entry 3355; 0 0 SEQUENCE SET podcast_episode_hosts_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_episode_hosts_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_episode_hosts_id_se...
^
Command was: SELECT pg_catalog.setval('public.podcast_episode_hosts_id_seq', 1, false);
pg_restore: [archiver (db)] Error from TOC entry 3356; 0 0 SEQUENCE SET podcast_episode_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_episode_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_episode_id_seq', 19...
^
Command was: SELECT pg_catalog.setval('public.podcast_episode_id_seq', 1995295, true);
pg_restore: [archiver (db)] Error from TOC entry 3357; 0 0 SEQUENCE SET podcast_show_categories_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_show_categories_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_show_categories_id_...
^
Command was: SELECT pg_catalog.setval('public.podcast_show_categories_id_seq', 3873, true);
pg_restore: [archiver (db)] Error from TOC entry 3358; 0 0 SEQUENCE SET podcast_show_hosts_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_show_hosts_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_show_hosts_id_seq',...
^
Command was: SELECT pg_catalog.setval('public.podcast_show_hosts_id_seq', 1, false);
pg_restore: [archiver (db)] Error from TOC entry 3359; 0 0 SEQUENCE SET podcast_show_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_show_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_show_id_seq', 27121...
^
Command was: SELECT pg_catalog.setval('public.podcast_show_id_seq', 27121, true);
pg_restore: [archiver (db)] Error from TOC entry 3360; 0 0 SEQUENCE SET podcast_show_itunes_categories_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_show_itunes_categories_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_show_itunes_categor...
^
Command was: SELECT pg_catalog.setval('public.podcast_show_itunes_categories_id_seq', 1, false);
pg_restore: [archiver (db)] Error from TOC entry 3361; 0 0 SEQUENCE SET podcast_speaker_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.podcast_speaker_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.podcast_speaker_id_seq', 1,...
^
Command was: SELECT pg_catalog.setval('public.podcast_speaker_id_seq', 1, false);
pg_restore: [archiver (db)] Error from TOC entry 3362; 0 0 SEQUENCE SET taggit_tag_id_seq postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.taggit_tag_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.taggit_tag_id_seq', 49920, ...
^
Command was: SELECT pg_catalog.setval('public.taggit_tag_id_seq', 49920, true);
pg_restore: [archiver (db)] Error from TOC entry 2912; 2604 34102 DEFAULT taggit_taggeditem id postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.taggit_taggeditem_id_seq" does not exist
Command was: ALTER TABLE ONLY public.taggit_taggeditem ALTER COLUMN id SET DEFAULT nextval('public.taggit_taggeditem_id_seq'::regclass);然而-如果我现在进入我的域,我可以看到数据在那里,并被Django访问/服务。持久化的错误会扼杀某些正在查询上述数据的页面。如果我试着做移民/移民,我会得到这样的结果:
django.db.utils.IntegrityError: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, curate, 0006_auto_20190429_1108, 2019-04-29 15:50:36.927028+00).为了记录在案,它所指的'podcast‘应用程序是我的虚拟主机修改后的应用程序。但是,在本例中,我已经将它从虚拟环境中移动,并将其重新定位到我的项目中的git -用它传输所有代码。
有人知道发生了什么吗?
我应该补充一下,代码库是通过git更新到pythonanywhere的。我在Atom上进行更改,然后提交它们。然后将它们推送到github,然后使用bash命令将它们拉到服务器上。
发布于 2019-04-29 17:35:00
pypy ( python编译器)和PyPI ( package索引)有很大的不同。我猜你是指后者。对于您需要修改的第三方包,您应该对它们进行分叉,进行更改并将它们推送到您的requirements.txt中;最后将链接放到您的分叉中。这是一个维护头疼的问题,所以如果您可以通过子类等获得相同的效果,那么这通常是一个更好的策略。
总之,如果您没有运行相同的代码,那么其他的代码肯定不会稳定。
对于数据库来说,3GB (未压缩)不是很大。在某些文件系统中,超过4GB的文件大小可能会出现问题,因此压缩/拆分备份可能在您的将来。
我对postgresql不太了解,但一般来说,在进行跨平台备份和还原时,您需要非常小心地选择格式和工具。在没有错误地执行还原之前,您绝对不应该向前推进。
看起来您可能有数据/约束错误("null值.违反非空约束“)。在备份之前,您应该修复数据库中的这些错误。
看起来,postgresql自动增量序列也有一些问题,尽管我不知道如何在postgresql中修复这个问题。
我会认真地建议长时间看一下pg_dump/pg_restore,而不是只完成一半工作的gui解决方案,cf。https://www.postgresql.org/docs/9.1/backup-dump.html和Restore a postgres backup file using the command line?.
如果您想要一个完整的gui解决方案,就会有Navicat (https://www.navicat.com/en/products/navicat-premium --我是一个满意的用户),它至少在我使用的数据库上使它成为一个选择、复制和粘贴操作。JetBrains‘DataGrip看起来也很有能力(https://www.jetbrains.com/datagrip/),虽然我只玩过它。
ps:在您的本地机器上,您应该在备份之前进行修改和迁移。当您在prod服务器上重复这些操作时,应该没有什么可做的(因为您在当前版本中“复制”了数据库的状态)。
发布于 2019-04-30 09:19:05
谢谢大家的帮助。我仔细地检查了我的项目,对迁移做了一个完全的“重置”,所以在我的本地机器上完全没有问题。
最后,我发现PythonAnywhere运行的是PSQL9.4,我运行的是PSQL11.2。我下载了PSQL 9.4,并尝试在本地备份所有内容,每次都会收到150个错误。PythonAnywhere暂时不打算升级它们的PSQL版本,我在开发过程中生成的数据相当有价值,所以我想保留它。
因此,我有两个选择。要么我可以尝试用MYSQL工作台迁移到MYSQL,希望保持数据的灵巧性,要么我可以完全放弃我已经生成的数据,坚持使用PSQL 9.4,然后重新开始。
https://stackoverflow.com/questions/55906868
复制相似问题