在heroku上运行loaddata而不将数据文件添加到存储库

时间:2013-02-23 14:56:38

标签: django heroku

我需要运行manage.py loaddata命令将一些数据导入到我的heroku实例的数据库中,而heroku的ethereal文件系统在这方面存在一些问题。我真的不希望不必将数据文件添加到我的heroku存储库并每次都要推送更新我想要运行loaddata(因为我需要定期执行此操作,并为不同的heroku实例运行不同的文件相同的代码库。)是否有办法a)在远程实例上运行loaddata而不将数据文件驻留在实例的文件系统上,可以通过管道输入数据或引用本地文件或b)上传文件并在同一会话中运行loaddata,以便在执行命令时该文件可以存在于实例上? (我意识到一旦交互式会话结束它就会消失)

4 个答案:

答案 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