将字段添加到App Engine托管的数据库

时间:2012-11-27 13:20:01

标签: database web-services google-app-engine datastore gql

我目前正在开发使用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;
}

永远不会在我的DB中创建“dateRefresh”字段...

有人帮我吗?

提前致谢

2 个答案:

答案 0 :(得分: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")

然后放手。

答案 1 :(得分:1)

虽然数据存储区有点模仿表,但数据存储在每个实体的基础上。没有架构或表格。

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

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

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

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

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

相关问题