我有一个带有一堆插入命令的 .sql 文件,我想在 heroku 上的 postgres 数据库上执行这些命令。但我不知道该怎么做:-
如果我可以访问 postgres 控制台,我会输入以下内容:
psql -h localhost -d database -U username -f datafile.sql
但似乎 heroku 不支持此命令。我试过了
heroku pg:psql
但这不允许我输入文件。
还有其他选择吗?
我有一个带有一堆插入命令的 .sql 文件,我想在 heroku 上的 postgres 数据库上执行这些命令。但我不知道该怎么做:-
如果我可以访问 postgres 控制台,我会输入以下内容:
psql -h localhost -d database -U username -f datafile.sql
但似乎 heroku 不支持此命令。我试过了
heroku pg:psql
但这不允许我输入文件。
还有其他选择吗?
对于像播种数据库这样的事情,我推荐 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
all 一起使用会很好。
例如
DATABASE_URL: postgres://username:password@host:port/dbname
变成
psql -h host -p port -d dbname -U username -f datafile.sql
我喜欢可测试和可重复的更新。当我需要更新数据库时,我会编写一个 rake 任务来执行更新;这样,您可以先针对测试运行它,以确保在生产中运行之前输出正确。
您没有提及这是初始数据库加载还是稍后运行,但将新数据加载到 Rails 数据库的惯例是创建一个db:seed
rake 文件,您可以在db:migrate
任务完成后执行该文件。
请参阅:http: //justinfrench.com/notebook/a-custom-rake-task-to-reset-and-seed-your-database 和:http ://railscasts.com/episodes/179-seed-data
我将建议另一种方法,因为我已经从这个问题中受益,并且我正在寻找更好的选择来做到这一点(在速度方面)。
我将数据库种子设置为环境变量。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 的更多信息。