74

我有一个带有一堆插入命令的 .sql 文件,我想在 heroku 上的 postgres 数据库上执行这些命令。但我不知道该怎么做:-

如果我可以访问 postgres 控制台,我会输入以下内容:

psql -h localhost -d database -U username -f datafile.sql

但似乎 heroku 不支持此命令。我试过了

heroku pg:psql

但这不允许我输入文件。

还有其他选择吗?

4

4 回答 4

128

对于像播种数据库这样的事情,我推荐 Richard Brown 的回答:可以说你最好使用 Rails 种子机制之类的东西,或者像 rake 任务这样的脚本。

也就是说,能够对 sql(原始或文件)进行管道传输是一项有用的功能,尤其是对于诸如简单查找或例行查询之类的幂等事务。在这种情况下,您可以使用以下任何方式执行本地 sql:

$ cat file.sql | heroku pg:psql --app app_name
$ echo "select * from table;" | heroku pg:psql --app app_name
$ heroku pg:psql --app app_name < file.sql
于 2013-03-06T01:56:10.857 回答
25

为什么不直接使用 psql?

如果您查看输出,heroku config您将看到您的应用程序正在使用的数据库 URL(DATABASE_URL 键) - 如果您将其分解为正确的位以便与psqlall 一起使用会很好。

例如

DATABASE_URL:  postgres://username:password@host:port/dbname

变成

psql -h host -p port -d dbname -U username -f datafile.sql
于 2013-03-07T08:59:35.650 回答
3

我喜欢可测试和可重复的更新。当我需要更新数据库时,我会编写一个 rake 任务来执行更新;这样,您可以先针对测试运行它,以确保在生产中运行之前输出正确。

您没有提及这是初始数据库加载还是稍后运行,但将新数据加载到 Rails 数据库的惯例是创建一个db:seedrake 文件,您可以在db:migrate任务完成后执行该文件。

请参阅:http: //justinfrench.com/notebook/a-custom-rake-task-to-reset-and-seed-your-database 和:http ://railscasts.com/episodes/179-seed-data

于 2013-03-06T01:36:39.523 回答
0

我将建议另一种方法,因为我已经从这个问题中受益,并且我正在寻找更好的选择来做到这一点(在速度方面)。

我将数据库种子设置为环境变量。WithSequelize将会是这样的(下面的代码只是为了演示条件):

// Node.js app
if (process.env.RESTARTDB) {
  sequelize.sync({ force: true }).then(() => {
    // "init" is a raw SQL query
    sequelize.query(init);
  });
}

如果您不想每次查询该文件时都重新启动应用程序,则不建议使用此方法SQL,但它比使用heroku pg:psql.

在这里,您可以找到有关如何配置 vars 的更多信息。

于 2020-09-03T19:00:47.197 回答