J'ai un modèle dans un magasin de données existant. Ce qui ressemble à ceci:Comment réinitialiser le type de propriété d'un modèle de banque de données avec l'API à distance
class SomeKind(db.Model):
name = db.StringProperty(required=True)
someField = db.BlobProperty(required=True)
Il y a environ 20000+ entités, de ce genre, dans le datastore Maintenant, je veux restructurer le genre et le rendre ainsi:
class SomeKind(db.Model):
name = db.StringProperty(required=True)
someField = db.StringProperty(required=True)
Je pense que je parcourir
- Parcourez le magasin de données pour supprimer les données "someField" existantes. de models.py
- Retirez la propriété
- Ajoutez la propriété, avec la nouvelle définition, models.py
Je suis stucked à (1) où je veux supprimer l'attribut existant avec l'API à distance:
import sys, time, urllib2
sys.path.append("gae/paths")
...
sys.path.append("myapp/path")
from google.appengine.ext import db
from google.appengine.api import memcache
from google.appengine.ext.remote_api import remote_api_stub
from models import *
def tryPut(db, set, tryLimit=10, seconds=5, trying=1):
try:
db.put(set)
return True
except urllib2.HTTPError:
if trying <= tryLimit:
print "retry (%d of %d) in 5 seconds" % (trying, tryLimit)
time.sleep(5)
tryPut(db, set, seconds, trying+1)
else:
print urllib2.HTTPError
sys.exit()
def main():
remote_api_stub.ConfigureRemoteDatastore(None,
'/remote_api', my_auth_func, 'myapp.appspot.com')
q = db.GqlQuery("SELECT * FROM SomeKind")
last_cursor = memcache.get('SomeKind/update')
if last_cursor:
q.with_cursor(last_cursor)
set = q.fetch(100)
while len(set) != 0:
for someKind in set:
print someKind.name
# this doesn't work
delattr(someKind, "someField")
# this doesn't work either
del someKind.someField
print "update to Google"
if tryPut(db, set):
cursor = q.cursor()
memcache.set('SomeKind/update', cursor)
if __name__ == "__main__":
main()
Je l'exécute sur ma machine. Le problème est ce script, soit la méthode utilisée, soulève toujours l'erreur:
Traceback (most recent call last):
File "./query.py", line 91, in <module>
main()
File "./query.py", line 66, in main
del someKind.someField
AttributeError: __delete__
La documentation (http://code.google.com/intl/en/appengine/articles/update_schema.html) a dit quelque chose comme « l'utilisation delattr pour supprimer la propriété obsolète et puis enregistrez l'entité ». Mais il n'y a pas d'exemple quoi que ce soit.
Comment est-ce que je peux faire ceci? Mes étapes étaient-elles correctes? Comment supprimer la propriété?
Désolé. J'ai mis à jour l'extrait maintenant. L'ancien champ est binaire, c'est pourquoi il est difficile de migrer. –
Mis à jour mon message avec des instructions plus spécifiques. –