2

現在、Google App Engine がホストする Web サービスを使用するモバイル アプリケーションを開発しています。

しかし、私は問題に直面しています。データベースのテーブルにフィールドを追加したいだけです。App Engine は従来の SQL 構文ではなく、GQL を使用します。したがって、ALTER TABLE ステートメントを使用することはできません。GQLでこれを行うにはどうすればよいですか? Webで解決策を探しましたが、あまり助けがありません。

public MyEntity() {
}

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key idStation;
private String name;
private double longitude;
private double latitude;
private java.util.Date dateRefresh = new Date(); //the field i want to add in DB

したがって、「MyEntity」オブジェクトを作成すると、「dateRefresh」フィールドがデータベースに追加されます...次のようにオブジェクトを作成します。

MyEntity station = new MyEntity();
station.setName("test");
station.setLatitude(0);
station.setLongitude(0);
station.setDateRefresh(new Date("01/01/1980"));

DaoFactory.getStationDao().addStation(station);

addStation メソッド:

@Override
public MyEntity addStation(MyEntity station) {
    EntityManager em = PersistenceManager.getEntityManagerFactory().createEntityManager();
    try {           
        em.getTransaction().begin();
        em.persist(station);
        em.getTransaction().commit();
    } finally {
        if(em.getTransaction().isActive()) em.getTransaction().rollback();
        em.close();
    }
    return station;
}

フィールド「dateRefresh」がDBに作成されることはありません...

誰か助けてください。

前もって感謝します

4

2 に答える 2

2

データ構造に別のフィールドを追加するだけで、default句を提供することができます。それだけです。たとえば、次の場合UserAccount:

class UserAccount(db.Model):
    user = db.UserProperty()
    user_id = db.StringProperty()

簡単に追加できます:

class UserAccount(db.Model):
    user = db.UserProperty()
    user_id = db.StringProperty()
    extra_info = db.IntegerProperty(default=0)
    timezone = db.StringProperty(default="UTC")

そしてそれを手放します。

于 2012-11-27T13:23:21.160 に答える
1

データストアはテーブルに似ていますが、データはエンティティごとに保存されます。スキーマやテーブルはありません。

モデル クラスを更新するだけで、新しいエンティティが新しいエンティティの構造 (フィールド) と共に保存されます。

ただし、古いエンティティとインデックスは自動的に更新されません。最初にデータストアに書き込まれたときと同じフィールドが残っています。

これを行うには 2 つの方法があります。1 つは、新しいプロパティが欠落している状況をコードが処理できるようにすることです。つまり、例外がスローされないようにするか、プロパティが欠落している場合に例外を適切に処理します。

2 番目の方法は、小さな関数 (mapreduce 関数を使用) を記述して、すべてのエンティティを新しいプロパティの適切な値または null 値で更新することです。

エンティティが書き込まれない限り、インデックスは更新されないことに注意してください。そのため、新しいインデックス付きプロパティを追加すると、新しいプロパティをクエリしても古いエンティティは表示されません。この場合、2 番目の方法を使用して、データストア内のすべてのエンティティを更新し、インデックスが作成されるようにする必要があります。

于 2012-11-27T15:18:26.237 に答える