一部のデータを heroku インスタンスのデータベースにインポートするために manage.py loaddata コマンドを実行する必要がありますが、heroku のイーサリアル ファイル システムには、この点に関していくつかの問題があります。データファイルをherokuリポジトリに追加して、loaddataを実行するたびに更新をプッシュする必要はありません(実行中のさまざまなherokuインスタンスのさまざまなファイルで定期的にこれを行う必要があるため) a) インスタンスのファイル システムにデータ ファイルを常駐させずに、リモート インスタンスで loaddata を実行する方法はありますか。おそらく、データをパイプするか、ローカルファイルを参照するか、b) ファイルをアップロードして同じセッションで loaddata を実行し、コマンドの実行中にファイルがインスタンスに存在できるようにしますか? (インタラクティブセッションが終了するとすぐに消えることに気づきました)
4 に答える
これが思いついたものです(標準入力からのパイプで私の(a)アイデアを使用して)が、heroku実行に関するこの問題のために機能しません:https://github.com/heroku/heroku/issues/256
標準入力を使用するために loaddata をラップする管理コマンド (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
Heroku のPG Backups アドオンは、これに役立ちます (おそらく、昨年の時点では存在していませんでした): https://devcenter.heroku.com/articles/heroku-postgres-import-export
このチュートリアルでは、SQL ダンプを作成するために使用する方法をかなり簡単に説明してpg_dump
います (リンクが変更された場合に備えて、ここにコマンドを追加します)。
$ 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>'
あなたの方法を試してみましたが、うまくいきましたが、ファイルサイズが大きくなるにつれていくつかの問題が発生しました。
またはloaddata
、ローカル DB にアクセスしてから、次の操作を行うことができます。
heroku pg:push mylocaldb HEROKU_POSTGRESQL_MAGENTA --app sushi
ドキュメント: https://devcenter.heroku.com/articles/heroku-postgresql#pg-push