2

我目前正在开发一个使用 Google App Engine 托管的网络服务的移动应用程序。

但我面临一个问题。我只想在我的数据库表中添加一个字段。App Engine 不使用经典的 SQL 语法,而是使用 GQL。所以我不能使用 ALTER TABLE 语句。我怎么能用 GQL 做到这一点?我在网上寻找解决方案,但没有太多帮助。

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”...

有人帮我吗?

提前致谢

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

虽然数据存储有点模仿表,但数据是按实体存储的。没有架构或表。

您需要做的就是更新您的模型类,新实体将与新实体的结构(字段)一起保存。

但是,旧实体和索引不会自动更新。它们仍然具有与最初写入数据存储区时相同的字段。

有两种方法可以做到这一点。一种是确保您的代码可以处理缺少新属性的情况,即确保没有抛出异常,或者在缺少属性时正确处理异常。

第二种方法是编写一个小函数(使用 mapreduce 函数)来使用新属性的适当或空值更新每个实体。

请注意,除非写入实体,否则不会更新索引。因此,如果您添加新的索引属性,则在查询新属性时不会显示旧实体。在这种情况下,您必须使用第二种方法并更新数据存储中的所有实体,以便为它们编制索引。

于 2012-11-27T15:18:26.237 回答