2011-05-22 2 views
2

Certaines entités du magasin de données Google App Engine peuvent être très volumineuses (elles contiennent des bogues de 1 Mo). Supposons que j'ai une classe d'entité avec les champs suivants (en utilisant Python pour l'exemple, mais la langue est sans importance):Frais généraux liés à la récupération de grandes entités dans Google App Engine

class File(db.Model): 
    name = db.StringProperty() 
    size = db.IntegerProperty() 
    contents = db.BlobProperty() 

Maintenant, quand je fais une requête, je reviens un objet de type File, qui vraisemblablement signifie qu'il y aura 1 Mo de transfert de données entre la base de données et le serveur Web, et qu'un objet Python de 1 Mo sera créé. Ces hypothèses sont-elles correctes?

Si oui, si je voulais afficher une table de fichiers sans récupérer tout leur contenu, je voudrais faire une requête telle que

SELECT * FROM File ORDER BY name ASC 

puis afficher une table du nom et la taille de chaque fichier . Ai-je raison de penser que cela entraînerait le contenu complet de chaque fichier du magasin de données dans un objet Python?

Puisque GQL n'autorise pas un "SELECT (name, size) FROM ..." de type SQL, je suppose qu'il n'y a aucun moyen de contourner cela, sauf de créer une entité distincte pour le contenu réel de chaque fichier.

class FileContents(db.Model): 
    contents = db.BlobProperty() 

class File(db.Model): 
    name = db.StringProperty() 
    size = db.IntegerProperty() 
    contents = db.ReferenceProperty(FileContents) 

Est-ce une pratique normale? Y a-t-il une autre solution? Notez que je ne souhaite pas utiliser le service Blobstore, car cela nécessite que la facturation soit activée.

Répondre

4

Oui, vous avez des suppositions sont correctes et oui vous avez besoin de deux modèles afin de pouvoir sélectionner uniquement le champ de nom.

+0

Merci de confirmer mes soupçons. – mgiuca

+1

Vous pouvez utiliser le blobstore pour stocker le fichier au lieu de la banque de données et utiliser 'db.BlobReferenceProperty'. –

+1

@Nick Johnson Comme je l'ai dit dans la question: "Notez que je ne veux pas utiliser le service Blobstore, car cela nécessite la facturation activée." Ce fait n'est en fait pas très clair; J'ai développé une application blobstore qui a échoué lorsque je l'ai téléchargée. – mgiuca

Questions connexes