我目前正在开发使用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”字段...
有人帮我吗?
提前致谢
答案 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函数)来为新属性更新具有适当值或空值的每个实体。
请注意,除非编写实体,否则不会更新索引。因此,如果添加新的索引属性,则在查询新属性时将不会显示旧实体。在这种情况下,您必须使用第二种方法并更新数据存储区中的所有实体,以便将它们编入索引。