我有一个。Sql 文件,其中包含一系列插入命令,我想在 heroku 上的 postgres 数据库中执行这些命令。但我不知道该怎么做:-
如果我能访问 postgres 控制台,我会输入以下内容:
psql -h localhost -d database -U username -f datafile.sql
但是 Heroku 似乎不支持这个命令
heroku pg:psql
但这不允许我输入文件。
还有别的选择吗?
我喜欢可测试和可重复的更新。当我需要更新数据库时,我编写一个 rake 任务来执行更新; 这样,您可以首先对 test 运行它,以确保在生产环境中运行之前输出是正确的。
您没有提到这是初始数据库加载还是稍后运行,但是将新数据加载到 Rails 数据库的惯例是创建一个 db:seed rake 文件,您可以在完成 db:migrate任务后执行该文件。
db:seed
db:migrate
参见: 《 http://justinfrench.com/notebook/a-custom-rake-task-to-reset-and-seed-your-database 》 还有: 《 http://railscasts.com/episodes/179-seed-data 》
对于种子数据库这样的事情,我推荐 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
为什么不使用 psql 呢?
如果你查看 heroku config的输出,你会看到你的应用程序正在使用的数据库 URL (DATABASE _ URL 键)-如果你把它们拆分成正确的位,以便与 psql一起使用,一切都会很好。
heroku config
psql
例句
DATABASE_URL: postgres://username:password@host:port/dbname
变成了
psql -h host -p port -d dbname -U username -f datafile.sql
我将建议另一种方法,因为我已经从这个问题中受益,我寻找 好多了选项来做到这一点(就快速性而言)。
我把数据库的种子设置成了一个环境变量。对于 Sequelize将会是这样的(下面的代码只是为了演示条件作用) :
Sequelize
// 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要快得多。
SQL
在这里 你可以找到更多关于 如何配置您的变量的信息。