我需要运行manage.py loaddata命令将一些数据导入到我的heroku实例的数据库中,而heroku的ethereal文件系统在这方面存在一些问题。我真的不希望不必将数据文件添加到我的heroku存储库并每次都要推送更新我想要运行loaddata(因为我需要定期执行此操作,并为不同的heroku实例运行不同的文件相同的代码库。)是否有办法a)在远程实例上运行loaddata而不将数据文件驻留在实例的文件系统上,可以通过管道输入数据或引用本地文件或b)上传文件并在同一会话中运行loaddata,以便在执行命令时该文件可以存在于实例上? (我意识到一旦交互式会话结束它就会消失)
答案 0 :(得分:7)
(......几年后)
@Ben Roberts'方法是明智的,但请注意,几年后,所有的障碍物都得到了解决:
-
因此,您不需要自定义管理命令。将数据从本地文件加载到Heroku现在应该如下所示:
$ cat your-data-file.json | heroku run --no-tty -a <your-app> -- python manage.py loaddata --format=json -
奖励:对于相同和相反的操作,您可以使用答案here转储数据。
[编辑:--no-tty
选项,感谢@rgov]
答案 1 :(得分:6)
这是一个想法(使用我的(a)想法与stdin的管道),但由于heroku运行的这个问题它不起作用:https://github.com/heroku/heroku/issues/256
一个管理命令,用于包装loaddata以使其使用stdin(如果你设置了django eviron,它可以写成python脚本):
# someapp/management/commands/loaddata_stdin.py
import os
import sys
from django.core.management import BaseCommand, call_command
class Command(BaseCommand):
def transfer_stdin_to_tempfile(self):
content = sys.stdin.read() # could use readlines if content is expected to be huge
outfile = open ('temp.json', 'w')
outfile.write(content)
outfile.close()
return outfile.name
def handle(self, *args, **options):
tempfile_name = self.transfer_stdin_to_tempfile()
call_command('loaddata', tempfile_name, traceback=True )
os.remove(tempfile_name)
用法:
$ cat some_dump.json | heroku run python manage.py loaddata_stdin.py
答案 2 :(得分:1)
Heroku的PG Backups add-on可以帮助你(也许去年的这个时候不存在):https://devcenter.heroku.com/articles/heroku-postgres-import-export
本教程以相当简单的术语描述了如何使用pg_dump
创建sql转储(如果链接发生变化,在此处添加命令):
$ pg_dump -Fc --no-acl --no-owner -h localhost -U <your username> mydb > mydb.dump
我亲自将mydb.dump
上传到Dropbox文件夹,然后运行pgbackups命令:
$ heroku pgbackups:restore <database url> '<url for mydb.dump>'
我尝试了你的方法并且它有效,但随着文件大小变大,遇到了一些问题。
答案 3 :(得分:0)
或者您可以Major Minor Build Revision
----- ----- ----- --------
10 0 19041 488
到您的本地数据库,然后:
loaddata
文档:https://devcenter.heroku.com/articles/heroku-postgresql#pg-push