Теперь, когда Google объявил о доступности облачного хранилища SQL для механизма приложений, каков будет лучший способ переноса существующих данных из BigTable / GAE Datastore в MySQL?
Чтобы ответить на прекрасные вопросы, поднятые Петром:
- В моем конкретном сценарии я держал свою модель данных очень реляционной.
- Я согласен отключить мой сайт на несколько часов для перехода или, по крайней мере, предупредить людей, что любые изменения, внесенные в течение следующих нескольких часов, будут потеряны из-за обслуживания базы данных и т. Д.
- Мой набор данных не очень большой - на главной панели моего приложения указано 0,67 ГБ, а на странице статистики хранилища данных указано, что это больше 200 МБ.
- Я использую Python.
- Я не пользуюсь хранилищем блобов (хотя я думаю, что это отдельный вопрос по сравнению с переносом чистого хранилища данных - можно использовать перенос хранилища данных в MySql при сохранении хранилища блобов).
- Я бы согласился заплатить разумную сумму (скажем, менее 100 долларов).
- Я считаю, что мое приложение Master / Slave - оно было создано во время предварительного просмотра App Engine. Кажется, я не могу найти простой способ проверить это.
Похоже, что массовый загрузчик должен быть в состоянии использовать для загрузки данных в текстовый формат, который затем может быть загружен с помощью mysqlimport, но у меня нет опыта работы с любой из этих технологий. Кроме того, похоже, что Cloud SQL поддерживает только импорт mysqldumps, поэтому мне нужно было бы установить MqSQL локально, mysqlimport данных, затем выгрузить их, затем импортировать дамп?
Пример кода моей текущей модели, если он требуется:
class OilPatternCategory(db.Model):
version = db.IntegerProperty(default=1)
user = db.UserProperty()
name = db.StringProperty(required=True)
default = db.BooleanProperty(default=False)
class OilPattern(db.Model):
version = db.IntegerProperty(default=2)
user = db.UserProperty()
name = db.StringProperty(required=True)
length = db.IntegerProperty()
description = db.TextProperty()
sport = db.BooleanProperty(default=False)
default = db.BooleanProperty(default=False)
retired = db.BooleanProperty(default=False)
category = db.CategoryProperty()
class League(db.Model):
version = db.IntegerProperty(default=1)
user = db.UserProperty(required=True)
name = db.StringProperty(required=True)
center = db.ReferenceProperty(Center)
pattern = db.ReferenceProperty(OilPattern)
public = db.BooleanProperty(default=True)
notes = db.TextProperty()
class Tournament(db.Model):
version = db.IntegerProperty(default=1)
user = db.UserProperty(required=True)
name = db.StringProperty(required=True)
center = db.ReferenceProperty(Center)
pattern = db.ReferenceProperty(OilPattern)
public = db.BooleanProperty(default=True)
notes = db.TextProperty()
class Series(db.Model):
version = db.IntegerProperty(default=3)
created = db.DateTimeProperty(auto_now_add=True)
user = db.UserProperty(required=True)
date = db.DateProperty()
name = db.StringProperty()
center = db.ReferenceProperty(Center)
pattern = db.ReferenceProperty(OilPattern)
league = db.ReferenceProperty(League)
tournament = db.ReferenceProperty(Tournament)
public = db.BooleanProperty(default=True)
notes = db.TextProperty()
allow_comments = db.BooleanProperty(default=True)
complete = db.BooleanProperty(default=False)
score = db.IntegerProperty(default=0)
class Game(db.Model):
version = db.IntegerProperty(default=5)
user = db.UserProperty(required=True)
series = db.ReferenceProperty(Series)
score = db.IntegerProperty()
game_number = db.IntegerProperty()
pair = db.StringProperty()
notes = db.TextProperty()
entry_mode = db.StringProperty(choices=entry_modes, default=default_entry_mode)