【问题标题】:Running loaddata on heroku without adding the data file to repository在 Heroku 上运行 loaddata 而不将数据文件添加到存储库
【发布时间】:2013-02-09 02:44:18
【问题描述】:

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

【问题讨论】:

    标签: django heroku


    【解决方案1】:

    (……几年后)

    @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]

    【讨论】:

    • 更新:在最新版本的 Heroku CLI 上,只有通过 --no-tty: heroku run --no-tty &lt;other options&gt; -- python manage.py ... 才能工作
    【解决方案2】:

    这是 a 的想法(使用我的 (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
    

    【讨论】:

    • 完美的方法,但现在已经过时 - 对 django 和 Heroku 的更新现在超出了对此的需求(请参阅我的答案以获取参考和更新)
    【解决方案3】:

    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>'
    

    我尝试了您的方法并且它有效,但是随着文件大小变大遇到了一些问题。

    【讨论】:

    • 是的,pg_dump 和 pgbackups:restore 绝对是一个完整的数据库转储/恢复的方法。我正在查看的是导入从 django 的 dumpdata 命令转储的部分数据集(不是完整的数据库甚至是完整的表)。我想可以用 pg_dump/restore 设计类似的东西,但它超出了我的范围......
    【解决方案4】:

    或者您可以loaddata 到您的本地数据库,然后:

    heroku pg:push mylocaldb HEROKU_POSTGRESQL_MAGENTA --app sushi
    

    文档:https://devcenter.heroku.com/articles/heroku-postgresql#pg-push

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 1970-01-01
      • 2020-02-27
      • 2016-07-25
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多