2013-02-23 43 views
3

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

+0

刚刚发现这个:http://rockycode.com/blog/django-loaddata-heroku/这正是我希望不需要做的......但我想它不是世界末日,如果这是唯一的选择。 – 2013-02-23 15:08:06

回答

5

下面是一个想法(使用我的(a)想法与来自stdin的管道),但它不起作用,因为与heroku运行:

# 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) 

用法:

https://github.com/heroku/heroku/issues/256

的管理命令,以便得到它使用标准输入(它可能只是被写成如果设置了Django的eviron一个python脚本)包裹lo​​addata

$ cat some_dump.json | heroku run python manage.py loaddata_stdin.py 
+0

完美的方法,但现在已过时 - 更新django和Heroku现在超过了这个需求(请参阅我的回答参考和更新) – thclark 2018-03-07 13:22:53

0

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

我试过你的方法,它的工作,但遇到一些问题,因为文件大小变大。

+0

是的,pg_dump和pgbackups:restore绝对是完整的数据库转储/恢复。我在看的是导入从django的dumpdata命令转储的部分数据集(不是完整的数据库,甚至是完整的表格)。我想象一下类似的东西可以用pg_dump/restore来设计,但它超出了我的想象...... – 2014-03-07 18:17:27

0

(......数年后)

@Ben罗伯茨的做法是明智的,但请注意,数年后,所有的障碍已得到修复:

所以你不需要一个客户端汤姆管理命令。从本地文件到Heroku的加载数据现在应该是简单的:

$ cat your-data-file.json | heroku run -a <your-app> python manage.py loaddata --format=json - 

奖励:为相等,方向相反的动作,你可以转储使用应答here数据。

相关问题