문제

SQL을 아는 사람을 위해 GQL이 쉽게 배우나요? Django/Python은 어떻습니까? 앱 엔진이 실제로 스케일링을 쉽게 만들 수 있습니까? "GQL 주입"에 대한 내장 보호가 있습니까? 등등...

App Engine을 사용하는 것이 좋지 않은 기복을 듣고 싶습니다.

건배!

도움이 되었습니까?

해결책

가장 눈부신 문제는 Datastore API입니다. DataStore API는 SQL에 익숙해지면 모든 쿼리 결과 세트에서 1000 행 제한을 가지고 있다면 멋지고 잘 생각되고 작업하기 쉽고 카운트에 액세스 할 수 없습니다. 또는 그 이상의 오프셋. 1000 행을 넘어서면 모델에 대한 데이터를 실제로 추가하거나 액세스 할 수 없기 때문에 이상한 문제가 발생합니다.

참조 1000 행 제한에 대한 오버플로 토론

아랄 발칸 이것과 다른 문제에 대한 정말 좋은 요약을 썼습니다.

그러나 App Engine은 실제로 처분 할 수있는 훌륭한 도구이며, 나는 그것을 가지고 일하는 것을 좋아합니다. 다른 앱에서 사용할 마이크로 웹 서비스 (예 : JSON API)를 배포하는 데 적합합니다.

다른 팁

Google App Engine에 대한 나의 경험은 훌륭했으며 1000 결과 제한이있었습니다 제거됨, 다음은 릴리스 노트에 대한 링크입니다.

앱 엔진 릴리스 노트

더 이상 1000 결과 한도 - 맞습니다 : 커서를 추가하고 지난 몇 개월 동안 많은 소규모 데이터 저장소 안정성 및 성능 향상의 정점으로 인해 최대 결과 한도를 완전히 제거 할 수있을만큼 확신합니다. 페치, 반복 또는 커서를 사용하든 결과 수에는 제한이 없습니다.

GQL은 매우 간단합니다. SQL 'Select'Statement의 하위 집합입니다. 그러나 하위 레벨 API의 상단에있는 편의층 일 뿐이며 모든 구문 분석은 파이썬에서 수행됩니다.

대신, 절차 적 쿼리 API를 사용하는 것이 좋습니다. 런타임 구문 분석이 필요하지 않으며 'GQL 주입'취약점을 완전히 불가능하게 만드는 것이 좋습니다 (어쨌든 적절하게 작성된 GQL에서는 불가능하지만). 쿼리 API는 매우 간단합니다. 모델 클래스에서 .all ()을 호출하거나 db.query (modelname)를 호출하십시오. 쿼리 객체에는 .filter (field_and_operator, value), .Arder (field_and_direction) 및 .ancestor (Entity) 메소드가 있습니다. GQL 객체는 (.get (), .fetch (), .count (.count ())를 가지고 있습니다. 등)) 각 쿼리 메소드는 편의를 위해 쿼리 객체 자체를 반환하므로 다음을 체인 할 수 있습니다.

results = myModel.All (). 필터 ( "foo =", 5) .Order ( "-bar"). fetch (10)

다음과 같습니다.

results = myModel.gql ( "여기서 foo = 5 bar desc limit 10에 의한 주문"). fetch ()

Appengine과 함께 작업 할 때의 주요 단점은 이미 의견에 언급 된 1K 쿼리 한도입니다. 내가 언급하지 않은 것은이 문제를 해결할 수있는 내장 정렬 주문이 있다는 사실입니다. Appengine Cookbook에서 :

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()

위의 코드는 원격 API와 함께 (참조 이 기사) 필요한만큼의 엔티티를 검색 할 수 있습니다.

위의 코드를 다음과 같이 사용할 수 있습니다.

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

myModels = deepFetch(allMyModel)

처음에 나는 SQL에서 GQL로 전환 한 다른 사람들과 같은 경험을 가지고있었습니다. 합류 할 수없고 1000 줄 이상을 세는 것 등 이상 앱 엔진을 좋아합니다. 나는 모든 오래된 프로젝트를 그것에 포팅하고 있습니다.

나는 그것을 사용하여 여러 번의 교통량이 많은 웹 응용 프로그램을 호스팅하는 데 사용합니다 (피크 시점에 그중 하나는 1 분에 50k 히트를 얻습니다.)

Google App Engine은 실제 데이터베이스를 사용하지 않으며 분산 된 해시 맵을 사용하는 것 같습니다. 이것은 SQL에 익숙한 사람들이 처음에는 보지 못할 다른 행동에 적합합니다. 예를 들어 일반 SQL로 품목을 얻는 것은 빠른 작동 일 것으로 예상되지만 GQL에서는 같은 방식으로 작동하지 않습니다.

다음은 몇 가지 문제가 있습니다.

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

내 개인적인 경험에서는 조정이지만 학습 곡선은 괜찮습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top