2009-04-01 7 views
7

क्या जीक्यूएल किसी ऐसे व्यक्ति के लिए सीखना आसान है जो एसक्यूएल जानता है? Django/पायथन कैसे है? क्या ऐप इंजन वास्तव में स्केलिंग को आसान बनाता है? क्या "जीक्यूएल इंजेक्शन" के खिलाफ कोई अंतर्निहित सुरक्षा है? और इतने पर ...Google App Engine पर आपका अनुभव क्या विकसित हो रहा है?

मुझे ऐप इंजन का उपयोग करने के बारे में स्पष्ट अप और डाउन को सुनना अच्छा लगेगा।

चीयर्स!

उत्तर

4

सबसे चमकदार और निराशाजनक मुद्दा डेटास्टोर एपीआई है, जो बहुत अच्छा लग रहा है और यदि आप SQL के लिए उपयोग किए जाते हैं तो बहुत अच्छी तरह से सोचा जाता है और काम करना आसान होता है, लेकिन सभी क्वेरी परिणामों में 1000 पंक्ति सीमा होती है, और आप कर सकते हैं इससे परे पहुंच या ऑफसेट नहीं है। मैंने वीरडर मुद्दों में भाग लिया है, वास्तव में एक मॉडल के लिए 1000 पंक्तियों से अधिक होने के बाद डेटा जोड़ने या एक्सेस करने में सक्षम नहीं है।

देखें Stack Overflow discussion about the 1000 row limit

अराल बाल्कन wrote a really good summary of this and other problems

कहा करने के बाद कि, एप्लिकेशन इंजन वाले निपटान के लिए एक बहुत अच्छा टूल है, और मैं वास्तव में इसके साथ काम का आनंद लें। यह अन्य ऐप्स में उपयोग करने के लिए माइक्रो वेब सेवाओं (उदाहरण: जेसन एपीआई) को तैनात करने के लिए एकदम सही है।

+0

फिक्स्ड! http://stackoverflow.com/questions/264154/google-appengine-how-to-fetch-more-than-1000 –

4

जीक्यूएल बेहद सरल है - यह एसक्यूएल 'चयन' कथन का सबसेट है, और कुछ नहीं। यह निचले स्तर के एपीआई के शीर्ष पर केवल एक सुविधा परत है, और सभी पार्सिंग पायथन में किया जाता है।

इसके बजाय, मैं क्वेरी एपीआई का उपयोग करने की अनुशंसा करता हूं, जो प्रक्रियात्मक है, किसी भी रन-टाइम पार्सिंग की आवश्यकता नहीं है, और 'जीक्यूएल इंजेक्शन' भेद्यता पूरी तरह से असंभव बनाता है (हालांकि वे ठीक से लिखित जीक्यूएल में असंभव हैं)। क्वेरी एपीआई बहुत आसान है: मॉडल क्लास पर कॉल करें .all() या db.Query (modelname) पर कॉल करें। क्वेरी ऑब्जेक्ट में .filter (field_and_operator, value), .order (field_and_direction) और .ancestor (इकाई) विधियां, सभी सुविधाओं के अलावा GQL ऑब्जेक्ट्स (.get(), .fetch(), .count()) हैं। , आदि) क्वेरी से प्रत्येक तरीका सुविधा के लिए क्वेरी वस्तु ही देता है, ताकि आप उन्हें श्रृंखला कर सकते हैं:

परिणाम = MyModel.all() को फिल्टर ("foo =", 5) .order ("। -पट्टी "।) लाने (10)

के बराबर है:

परिणाम = MyModel.gql ("। कहां से foo = 5 आदेश बार DESC सीमा 10 ") लाने()

1

Google ऐप इंजन वास्तविक डेटाबेस का उपयोग नहीं करता है, और स्पष्ट रूप से कुछ प्रकार के वितरित हैश मानचित्र का उपयोग करता है। यह खुद को कुछ अलग व्यवहारों के लिए उधार देगा कि जो लोग एसक्यूएल के आदी हैं वे पहले ही नहीं देख पाएंगे। तो उदाहरण के लिए नियमित एसक्यूएल में COUNT आइटम प्राप्त करना एक तेज़ ऑपरेशन होने की उम्मीद है, लेकिन जीक्यूएल के साथ यह वही काम नहीं करेगा।

यहां कुछ और मुद्दे हैं:

http://blog.burnayev.com/2008/04/gql-limitations.html

मेरे निजी अनुभव में, यह एक समायोजन है, लेकिन सीखने की अवस्था ठीक है।

4

ऐपइंजिन के साथ काम करते समय एक प्रमुख नकारात्मकता 1k क्वेरी सीमा थी, जिसका पहले से ही टिप्पणियों में उल्लेख किया गया है। मैंने जो उल्लेख नहीं किया है, वह यह तथ्य है कि एक अंतर्निहित क्रमबद्ध क्रम है, जिसके साथ आप इस मुद्दे के आसपास काम कर सकते हैं। appengine रसोई की किताब से:

 
def deepFetch(queryGen,key=None,batchSize = 100): 
    """Iterator that yields an entity in batches. 

    Args: 
    queryGen: should return a Query object 
    key: used to .filter() for __key__ 
    batchSize: how many entities to retrieve in one datastore call 

    Retrieved from http://tinyurl.com/d887ll (AppEngine cookbook). 
    """ 

    from google.appengine.ext import db 

    # AppEngine will not fetch more than 1000 results 
    batchSize = min(batchSize,1000) 

    query = None 
    done = False 
    count = 0 

    if key: 
    key = db.Key(key) 

    while not done: 
    print count 
    query = queryGen() 
    if key: 
     query.filter("__key__ > ",key) 
    results = query.fetch(batchSize) 
    for result in results: 
     count += 1 
     yield result 
    if batchSize > len(results): 
     done = True 
    else: 
     key = results[-1].key() 

रिमोट एपीआई के साथ ऊपर कोड एक साथ (this article देखें) के रूप में आप की जरूरत है आप के रूप में कई संस्थाओं को पुनः प्राप्त करने की अनुमति देता है।

आप इस तरह से ऊपर कोड का उपयोग कर सकते हैं: पहले मैं एक ही दूसरों के रूप में जो GQL को एसक्यूएल से संक्रमित कर दिया अनुभव था पर

 
def allMyModel(): 
    q = MyModel.all() 

myModels = deepFetch(allMyModel) 
2

- अजीब की तरह नहीं मिलती है ऐसा करने में सक्षम होने के लिए, और अधिक गिनती 1000 पंक्तियों से अधिक, आदि। अब मैंने कुछ महीनों के लिए इसके साथ काम किया है, मैं बिल्कुल ऐप इंजन से प्यार करता हूं। मैं अपनी सभी पुरानी परियोजनाओं को इस पर पोर्ट कर रहा हूं।

मैं इसका इस्तेमाल कई उच्च यातायात वेब अनुप्रयोगों की मेजबानी के लिए (शिखर समय में उनमें से एक 50 के एक मिनट के हिट हो जाता है।)

7

Google अनुप्रयोग इंजन के साथ मेरा अनुभव बहुत अच्छा रहा है, और परिणाम सीमा - यही कारण है कि है

app-engine release notes

कोई और अधिक है 1000 परिणाम सीमा: हटाया किया गया है, यहाँ रिलीज नोट्स के लिए एक लिंक है दाएं: कर्सर और के साथ कई छोटे डेटास्टोर स्थिरता और प्रदर्शन पिछले कुछ महीनों में सुधार, में हम अब अधिकतम परिणाम सीमा को हटाने के लिए पर्याप्त आत्मविश्वास रखते हैं। चाहे आप एक fetch कर रहे हैं, पुनरावृत्त, या कर्सर का उपयोग कर, परिणामों की संख्या पर कोई सीमा नहीं है।