如何在heroku上执行.sql脚本?

时间:2013-03-06 01:29:28

标签: sql postgresql heroku

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

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

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

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

heroku pg:psql

但这不允许我输入文件。

还有其他选择吗?

4 个答案:

答案 0 :(得分:107)

对于播种数据库这样的事情,我推荐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

答案 1 :(得分:19)

为什么不使用psql?

如果查看heroku config的输出,您将看到应用程序正在使用的数据库URL(DATABASE_URL键) - 如果您采用此方法并将它们拆分为正确的位以便与{{1}一起使用一切都会好的。

例如

psql

变为

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

答案 2 :(得分:3)

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

您没有提及这是初始数据库加载还是稍后运行,但是将新数据加载到Rails数据库的约定是创建一个db:seed rake文件,您可以在{{1}之后执行该文件。 1}}任务完成。

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

答案 3 :(得分:0)

我将建议另一种方法,因为我已经从这个问题中受益,并且我寻求了更好的选项(就速度而言)。

我将数据库种子条件化为环境变量。使用Sequelize将会是这样(下面的代码仅用于演示条件):

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

如果您不想在每次查询该SQL文件时都不想重新启动应用程序,则不推荐,但是这种方法比使用{ {1}}。

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