2016-07-03 12 views
0

私はこのガイドに従います。​​ 1つのGAEアプリケーションでデータをバックアップし、別の方法でデータを復元する方法については、APIコールでurlfetch.Fetch()が応答に時間がかかりすぎてキャンセルされました。

しかし、私は、ターゲットアプリケーション上でバックアップを復元するたびに、私はエラーを取得する:

The API call urlfetch.Fetch() took too long to respond and was cancelled. 

私が間違っているの何任意のアイデア?

答えて

0

あなたのurlfetch.Fetch()はrespsondに時間がかかりすぎて(60秒以上)タイムアウトしています。ここに記事がありますhttps://cloud.google.com/appengine/articles/deadlineexceedederrors

解決策の1つはタスクキューを使用することです。タスクキューのタイムアウトは長くなります。より適切には、ジョブを小さな部分に分割することができます。 https://cloud.google.com/appengine/docs/python/taskqueue/

ここでは、「プッシュ」タスクキューでこれを行う方法の簡単な例を示します。あるデータストアモデルから別のデータストアモデルへの移行が、あなたが探している冗長性ではないかもしれないことに気付きます。データストアのエンティティを別のアプリケーションに完全にバックアップするか、別のタイプのデータベースまたはクラウドサービスにバックアップすることができます。また、バックアップしている複数のモデルがある可能性もあります。

builtins: 
- deferred: on 

は、まずあなたがあなたのapp.yamlで組み込みコマンドに「延期」を追加する必要があります。これはcronジョブを24時間ごとに使用する「プッシュ」タスクキューを設定し、スケジュールの単純な例です。

次に、「バックアップ」と呼ばれる2番目のデータストアモデルを作成する必要があります。古いモデルをコピーして名前を変更するだけです。同じモデルではなく、同じモデルのバックアップを同じモデルで使用すると便利です。それらに同じプライマリを与え、同じキーをバックアップします。

class Backup(db.Model): # example 
    prop1 = db.StringProperty() 
    prop2 = db.StringListProperty() 
    prop3 = db.StringProperty() 

次のセットアップあなたのcron.yamlでcronジョブ:をapp.yamlハンドラへ

- description: Creates a backup of the target db every 24 hours at 10:45 GMT 
url: /backup 
schedule: everyday 10:45 

追加/バックアップは:

- url: /backup 
script: mybackup.py 
login: admin 

最後に、mybackup.py

from google.appengine.ext import deferred 
from google.appengine.ext import db 
#from google.appengine.ext import ndb 

def backup_my_model(model_name): 
    """ 
    Takes all enities in the model_name model and copies it to Backup model 
    """ 
    logging.info("Backing up %s" % model_name) 
    query = db.GqlQuery('SELECT * From %s ' % model_name) 
    for primary_db in query: 
     backup = Backup(key_name = primary_db.key_name) 
     backup.prop1 = primary_db.prop1 
     backup.prop2 = primary_db.prop2 
     ... 
     backup.put() 



deferred.defer(backup_my_model, MyModel) #where MyModel is the model you want to backup 
deferred.defer(backup_my_model, MyOtherModel) 
... 
deferred.defer(backup_my_model, MyFinalModel) 

Iを作成します助けてくれることを望む。

+0

私はDatastore Adminを使用していますが、使用するタスクキューを設定する方法はありません。http://screencast.com/t/H6cTrvvr – ThomasD

+0

あなたがしようとしていることを達成するためにあなたがデータストア管理者からではなく、あなたのアプリからそれをやる必要があるタスクで。あるデータストアモデルから別のデータストアモデルへの単純な例を与えるためにコードを更新します。 – Doug

+0

本番データベースをバックアップし、テスト環境で復元しようとしています。だから、私は生産のGoogleアプリエンジンのアプリからGoogle App Engineのテストアプリにデータをコピーしようとしています。限り、私は上記のあなたのコードは、同じアプリ内ではなく、アプリケーション間で別のモデルにデータをコピーすることができますか? – ThomasD

関連する問題