我需要运行manage.py loaddata命令将一些数据导入到我的heroku实例的数据库中,而heroku的空灵文件系统在这方面存在一些问题。我真的不希望将数据文件添加到我的heroku存储库,并且每次运行loaddata时都会推送更新(因为我需要定期对不同的文件执行不同的文件,以便运行不同的heroku实例) )有没有办法a)在远程实例上运行loaddata,而不需要将数据文件驻留在实例的文件系统上,或者通过管道传输数据或引用本地文件,或者b)上传文件并在同一个会话中运行loaddata,以便在命令执行时该文件可以存在于实例中? (我意识到它会在交互式会话结束后立即消失)在heroku上运行loaddata而不添加数据文件到版本库
回答
下面是一个想法(使用我的(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脚本)包裹loaddata
$ cat some_dump.json | heroku run python manage.py loaddata_stdin.py
完美的方法,但现在已过时 - 更新django和Heroku现在超过了这个需求(请参阅我的回答参考和更新) – thclark 2018-03-07 13:22:53
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来设计,但它超出了我的想象...... – 2014-03-07 18:17:27
(......数年后)
@Ben罗伯茨的做法是明智的,但请注意,数年后,所有的障碍已得到修复:
- Django load data now accepts input from stdin using a
-
- 的Heroku运行命令管道是固定的(the issue linked by Ben is now closed)
所以你不需要一个客户端汤姆管理命令。从本地文件到Heroku的加载数据现在应该是简单的:
$ cat your-data-file.json | heroku run -a <your-app> python manage.py loaddata --format=json -
奖励:为相等,方向相反的动作,你可以转储使用应答here数据。
- 1. 耙文件看到Heroku上的旧版本的数据库
- 2. 将文本添加到数据库
- 3. 运行Heroku rake db:在Heroku上迁移不会迁移数据库
- 4. Uable在postgre数据库上运行heroku上的迁移
- 5. 在rails 1.2.6(旧版本)中添加列到数据库表
- 6. 更新文件,而应用程序运行在heroku上
- 7. 不添加到数据库
- 8. C#将数千行从文本文件快速添加到数据库
- 9. 将新版本的数据库文件复制到设备上
- 10. 将文档和元数据添加到文档库而不创建2个版本
- 11. 在旧版magento版本上从文件切换到数据库会话
- 12. C#将文本添加到文本文件而不重写它?
- 13. NedB在Heroku上不保留数据库文件
- 14. 运行python时出现数据库错误manage.py loaddata datadump.json
- 15. 在POST上添加一行换行到sql数据库和php
- 16. 将数据添加到服务器上的文本文件 - iOS
- 17. 将数据添加到本地主机上的Mysql数据库
- 18. 将版本/历史记录系统添加到数据库表
- 19. 递归添加文件到Subversion版本库
- 20. 将php数据库添加到java脚本文件
- 21. 快捷方式文件添加到本地SQL数据库
- 22. Ruby版本在Heroku上不升级
- 23. 到LINQ添加项目,而不把它保存到数据库
- 24. 文件上传与添加链接到数据库
- 25. 添加时间到上传的文件和数据库
- 26. 不能添加数据到文件
- 27. 将sqlite数据库添加到可执行的JAR文件
- 28. 将文件版本动态添加到Carrierwave上传器
- 29. 从数据库记录运行php脚本而不使用eval()
- 30. 在早期版本上运行的Python可执行文件
刚刚发现这个:http://rockycode.com/blog/django-loaddata-heroku/这正是我希望不需要做的......但我想它不是世界末日,如果这是唯一的选择。 – 2013-02-23 15:08:06