2016-06-01 10 views
1

Go Structに新しい属性を追加しました。データストアのエンティティの種類で永続化されました。goを使用してGoogleデータストアのスキーマを変更しますか?

私は新しい属性にフィルタを使用してエンティティをロードしようとした:新しい属性が追加された後に作成された方を対象として、これだけ働い

q := datastore.NewQuery("Person").Filter("Employed =", false) 

属性がフィルタに追加される前に作成されたものの、フィルタで除外された属性を持つ人はいませんでした。ループと第二段階で

  • まず、負荷のすべてのエンティティとフィルタ:

    私はこれを処理するための二つの方法を考えています。これにより、コードが複雑になります。

  • プロパティを追加してfalseに設定するすべてのエンティティを一括読み込みして再保存します。新しい属性を追加するたびにこれを行うことを忘れないでください。

これらのタイプのエンティティスキーマの変更を処理する方法はありますか?

+0

私は、アプリケーションコードでこれを扱うのではなく、データを改造する必要があると思います。データストアのスキーマを更新する場合は、アプリに特別な機能を追加して更新する必要はありません。古いデータを修正して、アプリが取得する内容が一貫しているようにする必要があります。 – evanmcdonnal

+0

これを行うにはどうすればよいでしょうか? – user1283776

+1

データストアによって異なります。 SQL互換のRDBMSでは、新しい列を追加するときにデフォルト値を指定できます。 'ALTER TABLE persons追加されたCOLUMNはBOOLEAN DEFAULTをtrueにしました。 'または、振り返ってみると、SET採用者=真のIS NULLを採用した人を更新できます。もちろん、その単純な「真」は、既存の列の値に応じて任意の式にすることができます。 –

答えて

2

適切な方法は、古いエンティティを買う余裕があれば再保存することです。

Python map/reduce libraryを使用すると、古いエンティティを更新できます。

Goに固執したい場合は、task queues & query cursorsを使用して簡単なバッチ処理を行うことができます。

私たちのPythonアプリケーションでは、新しいバージョンでエンティティを読み込んで不足しているプロパティがないかどうかをチェックすることができるたびに、「飛行中のホットアップデート」手法を採用しています。いくつかの小道具が時代遅れである場合、私たちはそれらを1ヶ月間保つか、またはそれらを除去するロジックを追加します。これにより、徐々に移行したり、頻繁に問題を起こすことなく(たわごとが起きる)ロールバックすることができます。また、追加の読み込み/書き込みの費用を払わないので、費用対効果も高くなります。いったんOKなら、mapreduceを走らせることができます。これにはダウンタイムは含まれません。ダウンタイムが必要な場合や必要がない場合があります。これは本当に変更に依存します。

Goでは、構造体に対応するフィールドがないエンティティを読み込もうとすると、Goがパニックになる可能性があります。それについてのいくつかの回避策があるはずです(私は特別なインターフェイスまたは任意のエンティティをロードすることができる構造体について何かを覚えています))しかし、私はまだGAEに行くと多くの実用的な経験がありません。

+0

私たちのプロセスはどのようにすべきですか?更新されたWebアプリケーションをリリースした後、直ちにすべてのエンティティを読み込んで保存します。ジョブが完了するまで、ユーザーに問題が発生する可能性があります。問題が発生する危険性を排除するために、ダウンタイムの最中にダウンタイムがあり、ダウンタイム中にこのアップデートジョブを実行する必要がありますか? – user1283776

+0

私たちのPythonアプリケーションでは、新しいバージョンでエンティティを読み込んで不足しているプロパティがないかどうかをチェックすることができます。いくつかの小道具が時代遅れである場合、私たちはそれらを1ヶ月間保つか、またはそれらを除去するロジックを追加します。これにより、徐々に移行したり、頻繁に問題を起こすことなく(たわごとが起きる)ロールバックすることができます。また、追加の読み込み/書き込みの費用を払わないので、費用対効果も高くなります。いったんOKなら、mapreduceを走らせることができます。これにはダウンタイムは含まれません。ダウンタイムが必要な場合や必要がない場合があります。これは本当に変更に依存します。 –

+0

私の答えに加えてください。 –

関連する問題