Добавить поле в базу данных, размещенную на App Engine
В настоящее время я занимаюсь разработкой мобильного приложения, которое использует веб-сервис 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 никогда не создается в моей БД...
Кто-нибудь, чтобы помочь мне, пожалуйста?
заранее спасибо
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")
и отпустить.
В то время как хранилище данных имитирует таблицы, данные хранятся для каждого отдельного объекта. Там нет схемы или таблицы.
Все, что вам нужно сделать, это обновить класс модели, и новые сущности будут сохранены со структурой (полями) новой сущности.
Однако старые сущности и индексы не обновляются автоматически. Они по-прежнему имеют те же поля, что и при первоначальной записи в хранилище данных.
Есть два способа сделать это. Один из них - убедиться, что ваш код может обрабатывать ситуации, в которых отсутствуют ваши новые свойства, т. Е. Не создавать исключений, или правильно обрабатывать исключения, когда вы пропускаете свойства.
Второй способ - написать небольшую функцию (например, функцию mapreduce), чтобы обновить каждый объект соответствующими или нулевыми значениями для ваших новых свойств.
Обратите внимание, что индексы не обновляются, если объект не записан. Поэтому, если вы добавите новое индексированное свойство, старые объекты не будут отображаться при запросе нового свойства. В этом случае вы должны использовать второй метод и обновить все объекты в хранилище данных, чтобы они были проиндексированы.