2012-10-24 23 views
22

Ben otomatik kimliği bir sayıdır tip Key (tür, id) ait anahtar oluşturur koymak NDB yöntemi ile bir nesne oluşturduğunuzda. Tüm belgeler üzerinde, anahtarın kimliği için bir dize kullanabileceğinizi ancak bir nesne oluşturulduğunda bunu otomatik olarak nasıl yapacağınızı gösteremediğimi gösterir.Google App Engine NDB özel anahtar id

Bir Kullanıcı modelini var ve daha hızlı geri alma için anahtarın kimliğiyle (eşsiz beri), kullanıcının adını kullanmayı düşünüyordum. Bu iyi bir fikir mi? Kullanıcı gönderildiği için kullanıcı adıyla ilgili herhangi bir sorun yaşayabilir miyim (girişi onaylıyorum)?

cevap

30
class UserModel(ndb.Model): 
    ... 

user_model_entity = UserModel(id='some_string', ...) 

Bu kimlikler değişebilirse, bu kötü bir fikir olabilir. Kendi sisteminizse ve potansiyel değişikliklere tepki gösterebilirseniz, bu iyi bir fikirdir, ancak kullanmadan önce kimliğin benzersiz ve göreceli olarak kararlı olmasını sağlamalısınız.

+0

Cevabınız için teşekkürler, bu aslında mantıklı. Bundan daha karmaşık olduğunu düşündüm. – andrei

+0

Daha önce bu yaklaşımla gecikme sorunu yaşadım. "Sıcak tabletler" sorunuyla karşılaşacağınız için, Datastore varlıklarının kimliklerini manuel olarak ayarlamak iyi bir fikir değildir. Veri deposunun varlık kimliklerini otomatik olarak oluşturmasına ve verileri kendisinin şifrelemesine izin vermemesi en iyisidir. Bunun yerine varlıkta bir Mülk kullanın. Otomatik olarak artırılan birincil anahtarlar gibi Veritabanına ilişkisel veritabanı kurallarını uygulamak cazip gelebilir, ancak bu gerçekten de anahtar boşluğunun paylaşılmasını geri alır ve sorunlar oluşturur. [1] NDB kurucu işaret etmek için –

13

Nesnenin kimliğini, oluşturma sırasında belirtebilirsiniz. Modeli tanımladığınızda, orada bir kimlik özniteliği belirlemezsiniz. Bu nedenle, örneğin var:

class User(ndb.Model): 
    # fields here 

Eğer modeli oluştururken, var: kullanıcı adı özeldir ve girişinizi doğrulamak

user = User(id='username', ...) 

yana, o zaman bu herhangi bir sorun olmaz yaklaşım.

ndb Model kurucusu hakkında daha fazla bilgi için, NDB Model Class - Constructor'a bakabilirsiniz.

Bu yardımcı olur umarım.

+1

sayesinde https://cloud.google.com/appengine/articles/handling_datastore_errors – ggauravr

0

Ayrıca, model varlık için tamsayı kimliğini (şart değil bir dize) sağlayabilmektedir.

class User(ndb.Model): 
... 

user = User(id=1234567890, ...) 
user.put()