将数据库推送到Heroku:如何使用Heroku pg:push

17
我想使用heroku pg:push命令将我本地的postgresql数据库推送到Heroku。 命令如下:heroku pg:push mylocaldb DATABASE --app sushi 根据Heroku文档:https://devcenter.heroku.com/articles/heroku-postgresql
这是我的本地数据库信息:
Name: mysitedb
User: bill
Password: bill

我的机器中的 DATABASE_URL 环境变量被设置为:postgres://bill:bill@localhost/mysitedb

我的应用程序名是 secure-gorge-4090。我尝试过 heroku pg:push mysitedb DATABASE --app secure-gorge-4090 命令,输出结果如下:

 !    Remote database is not empty.
 !    Please create a new database, or use `heroku pg:reset`

我很惊讶地发现我没有将任何东西放入我的DATABASE中。但我仍然运行了heroku pg:reset DATABASE来重置我的DATABASE。之后,我再次尝试heroku pg:push mysitedb DATABASE --app secure-gorge-4090,但输出结果仍然相同。

我尝试运行heroku pg:push postgres://bill:bill@localhost:8000/mysitedb DATABASE --app secure-gorge-4090,输出结果为:

!    LOCAL_SOURCE_DATABASE is not a valid database name

我不知道如何使用这个命令将我的本地数据库移动到Heroku。我需要你的帮助。谢谢!

6个回答

20

你在命令中实际输入了令牌DATABASE,还是这只是你在这个问题中使用的占位符?来自你链接到的文档

Like pull but in reverse, pg:push will push data from a local database into 
a remote Heroku Postgres database. The command looks like this:

$ heroku pg:push mylocaldb HEROKU_POSTGRESQL_MAGENTA --app sushi

This command will take the local database “mylocaldb” and push it to the 
database at DATABASE_URL on the app “sushi”. In order to prevent accidental 
data overwrites and loss, the remote database must be empty. You will be 
prompted to pg:reset an already a remote database that is not empty.

Usage of the PGUSER and PGPASSWORD for your local database is also supported
for pg:push, just like for the pg:pull commands.

执行heroku config -a secure-gorge-4090命令时,您应该会看到一个HEROKU_POSTGRESQL_[SOME COLOR NAME]的条目。请确保在您的命令中使用这个令牌,而不是DATABASE

由于您在本地数据库上有用户名和密码,您还需要执行关于PGUSERPGPASSWORD的相关步骤。以下是来自pg:pull文档的示例:

$ PGUSER=postgres PGPASSWORD=password heroku pg:pull HEROKU_POSTGRESQL_MAGENTA mylocaldb --app sushi

所以你应该做类似这样的事情:

$ PGUSER=bill PGPASSWORD=bill heroku pg:push mysitedb HEROKU_POSTGRESQL_[SOME COLOR] -a secure-gorge-4090

感谢您关注这个老问题!我刚才在命令中输入了 DATABASE。实际上,DATABASE 已经被设置为我的默认数据库 -- HEROKU-POSTGRESQL-VIOLET。因此,命令 heroku pg:push mysitedb DATABASE --app secure-gorge-4090heroku pg:push mysitedb HEROKU-POSTGRESQL-VIOLET --app secure-gorge-4090 应该具有相同的效果。根据您的建议,我创建了一个名为 HEROKU_POSTGRESQL_COBALT 的新数据库,并尝试了 PGUSER=bill PGPASSWORD=bill heroku pg:push mysitedb HEROKU_POSTGRESQL_COBALT --app secure-gorge-4090,但是出现了相同的错误。 - Yang Wenhao
哪个错误?您提到了“远程数据库不为空”错误和“LOCAL_SOURCE_DATABASE不是有效的数据库名称”错误。 - carols10cents
你在 HEROKU_POSTGRESQL_COBALT 上运行了 pg:reset 吗? - Thyago B. Rodrigues
3
@carols10cents 我收到了 'PGUSER' is not recognized as an internal or external command, operable program or batch file. 的错误提示,请帮忙解决。 - Ahtisham
PGUSER和PGPASSWORD是路径变量吗? - nassim
显示剩余2条评论

10

我知道这是一个旧的讨论,但我也遇到了完全相同的问题。虽然不太方便,但我最终通过使用pg:backups解决了这个问题。

Heroku支持网站上详细说明了如何操作:heroku support site

首先安装免费的pgbackups插件:

heroku addons:add pgbackups

然后使用你的本地pg_dump实用程序(包含在PostGreSQL发行版中)备份数据库

pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb > mydb.dmp

将那个转储文件放在某个可以通过URL访问的地方(例如Dropbox),并运行heroku import命令(在Windows上确保它是双引号):

然后将该转储文件放在某个可以通过URL访问的位置(如Dropbox),并运行Heroku导入命令(确保Windows使用双引号):

heroku pg:backups:restore 'https://dropbox.com/dYAKjgzSTNVp4jzE/mydb.dmp' DATABASE_URL

1
需要注意两点:警告:heroku addons:add已被弃用,请改用heroku addons:create。!无法找到“pgbackups”的插件服务或插件计划。 - jasonleonhard

3
您需要使用以下命令:
PGUSER=root PGPWD=root heroku pg:push (local database name) DATABASE_URL --app heroku (app name)

请确保您输入了正确的PostgreSQL用户名和密码。

我收到了“PGUSER”未被识别为内部或外部命令、可执行程序或批处理文件的错误提示。 - nassim

0

对于那些可能遇到无法将本地的PostgreSQL推送到Heroku(Windows)的问题的人,请听我说

  1. 使用GUI或CLI在Heroku上创建一个Addon
  2. 以管理员身份打开CMD
  3. 首先,使用pg_dump -s -f <DB_OUTPUT_NAME_ONLY_SCHEMA> --no-owner --no-acl -U <USERNAME> <LOCAL_DB_NAME>dump模式,不包括数据
  4. 其次,使用heroku pg:psql --app <APP_NAME> < <DB_OUTPUT_NAME_ONLY_SCHEMA>在Heroku上恢复数据库
  5. 第三,使用pg_dump -a -f <DB_OUTPUT_NAME_ONLY_DATA> --no-owner --no-acl -U <USERNAME> <LOCAL_DB_NAME>dump数据,不包括模式
  6. 第四,使用heroku pg:psql --app <APP_NAME> < <DB_OUTPUT_NAME_ONLY_DATA>在Heroku上恢复数据

0

对我而言没有任何问题的是

pg_dump -f database_output_name --no-owner --no-acl -U user_name name_of_your_local_database
  • database_output_name:输出文件的名称,您可以将其重命名为备份、数据库等等
  • user_name:postgres SQL用户名称,主要是postgres
  • name_of_your_local_database:是您的数据库名称:mydb或其他您指定的名称。如果您忘记了它,则可以在PgAdmin中检查
  • pg_dump:我已将其导出到全局路径,这就是我这样使用的方式。其他方法可以使用绝对路径调用它,例如:C:\"Program Files"\PostgreSQL\14\bin\pg_dump

生成的输出文件应该类似于这样:

--
-- PostgreSQL database dump
--

-- Dumped from database version 14.1
-- Dumped by pg_dump version 14.1

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- Name: alembic_version; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.alembic_version (
    version_num character varying(32) NOT NULL
);

...

现在运行此命令在Heroku上创建数据库

heroku pg:psql --app heroku_app_name < database_output_name

如果您想重置数据库,可以运行此命令。
heroku pg:reset -a heroku_app_name

现在您可以通过单击Postgres链接来检查Heroku上的数据库。 请查看此答案以获取更多详细信息:pg_restore:错误:在尝试将Postgres数据库导入Heroku时搜索存档时无法识别数据块类型(0)


0

我是一个懒惰但高效的程序员,所以这比支付 AWS 备份存储在 Excel 表格中更容易。 这样可以节省成本,而且不使用 PUSH: PULL,因为这不是高效的。

使用 CMD 作为管理员将 Excel 数据插入 Heroku Postgres 数据库。

按照说明操作。

1. OPEN CMD AS ADMIN

2. heroku pg:sql postgresql-rugged-08088 --app sample

3. CREATE TABLE SERIAL_T (  id SERIAL , SERIAL VARCHAR(50),  USE INT,    DEVICES TEXT[], PRINTED BOOLEAN,  PRIMARY KEY (id))

4. \COPY SERIAL_T (SERIAL, USE, DEVICES, PRINTED) FROM 'C:\Users\PATH\EXCEL-03-27-2021.csv' DELIMITER ','CSV HEADER;

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接