我有一个带有一堆插入命令的.sql文件,我想在heroku上的postgres数据库上执行。但我不知道怎么做: -
如果我可以访问postgres控制台,我会输入以下内容:
psql -h localhost -d database -U username -f datafile.sql
但似乎heroku不支持此命令。我试过
heroku pg:psql
但这不允许我输入文件。
还有其他选择吗?
答案 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 的更多信息。