문제

는데,서버가 실행되는 많은 다른 사람이 아닌 모든 내가 누구에 직접 연락처니다.서버가 서로 통신에서 클러스터입니다.일부 서버의 기능을 선택하는 것이 작은 행의 하위 집합에서 잠재적으로 아주 큰 표입니다.정확한 선택의 무슨 행을 선택해야 중 일부 튜닝하는 것이 중요한 사람이 실행되는 클러스터(예를 들어,자신)를 업데이트 선택 기준을 받지 않고 각각의 서버 관리자에게 배포하는 새로운 버전의 서버입니다.

단순히 쓰는 함수에서는 파이썬지 않았기 때문에 아무도를 설치하려는 서버를 다운로드 및 실행되는 임의의 Python 에 코드를 런타임입니다.

내가 무슨 필요가가 제안하는 가장 간단한 방법을 구현하는 도메인 특정 언어를 이러한 목표를 달성한다.언어 필요할 수 있는 간단한 식 평가뿐만 아니라,쿼리에 인덱스 테이블과 반복을 통해 반환되는 행이 있습니다.편의 읽고 쓰기의 언어를 쉽게 구현니다.나도 좋아하지 않을 작성해 전체 쿼리 최적화 도구,그래서 뭔가를 명시적으로 지정하는 인덱스를 쿼리하는 것이 이상적입니다.

인터페이스는 이를 컴파일에 대한 것입 비슷한 기능이 무엇인용 엔진 데이터 저장소 exports:할 수 있습에 대한 쿼리를 순차 범위에 인덱스 테이블에(예를 들어,보다,큰보다,범위와 동등 쿼리),그런 다음 필터 반환된 행에 의해 어떤 boolean 표현이다.을 연결할 수도 있습 여러 개의 독립적인 결과 함께 설정합.

내가 이것을 깨닫게 질문을 많이 들리는 같은 나에 대한 SQL.그러나 나는 원하지 않을 필요로 하는 데이터 저장소 백업 이러한 데이터를 관계형 데이터베이스,그리고 나는 원하지 않는다는 오버헤드를 노력하고 다시 구현 SQL 자신입니다.나는 또 다루는 단 하나의 테이블로 알려진 스키마.마지막으로,조인이 필요한 것입니다.가 훨씬 간단하게 할 것이 바람직합니다.

편집:확장된 설명하는 몇 가지 오해.

도움이 되었습니까?

해결책

건설 DSL 을 해석에 의해 파이썬.

단계 1.빌드 실행 시간 클래스 및 객체입니다.이 클래스는 모든 커서가 루프와 SQL 문의 모든 것을 알고리즘 처리에 자리 잡고 그들의 방법이 있습니다.당신이 집중적으로 사용 명령전략 디자인 패턴을 구성됩니다.대부분의 것은 명령,옵션 및 선택 플러그인 전략입니다.보에서 디자인에 대한 아파치는 개미의 작업 API-그것의 좋은 예입니다.

단계 2.검증하는 시스템 객체의 실제로 작동합니다.있는지 확인하고 디스플레이에 완료됩니다.당신은 테스트를 구성하는 것 명령과 전략체,다음을 실행하는 최고 수준의 명령 객체입니다.명령 객체를 작업을 할 것입니다.

이 시점에서 당신은 크게 한다.귀하의 실행 시간은 단지 구성에서 생성된 개체 위의 도메인에 있습니다.[이만큼 쉽지 않다 그것은 소리입니다.그것은 필요 어떤 관심을 집합을 정의 클래스의 인스턴스화할 수 있는 다음"얘기 중에서"자신의 작업을 수행합니다.]

참고는 당신이 필요로 할 것이 아무것도보다 더 많은 선언입니다.무엇이 잘못된 절차?중 하나를 시작할 쓰 DSL 으로는 절차적 요소,당신은 당신이 필요하다는 사실을 확인한 더 많은 기능을 때까지 당신이 작성한 파이썬은 다른 구문입니다.좋지 않다.

또한,절차상의 언어로 통역은 단순히 하드를 작성합니다.상태의 실행 및 범위의 참조는 단순히 하드를 관리할 수 있습니다.

당신이 사용할 수 있는 네이티브 파이썬--및 중지에 대한 걱정 방법"sandbox".실제로,어떻게 당신은 단위 테스트,모든 것을 사용하여 짧은 Python 스크립트를 작성합니다.Python 될 것입니다 DSL.

["하지만 기다려",당신이 말하면"나는 단순히 사용하는 파이썬 DSL 사람들이 실행할 수 있는 임의의 일이다." 에 따라 달라집에서 무엇 PYTHONPATH 및 sys.경로에 있습니다.보 모듈을 위한 제어하는 방법은 무엇인 사용이 가능합니다.]

선언 DSL 은 간단합니다.그것은 전적으로 운동에서의 표현입니다.의 블록 Python 는 단순히 값을 설정의 일부 변수가 좋은 것입니다.는 장고 사용합니다.

사용할 수 있습니다 상자를 계산할 수도 있 으로 언어를 나타내는 실행시 설정됩니다.

당신이 사용할 수 있는 JSONYAML 으로 언어를 나타내는 실행시 설정됩니다.준비가 만든 파서 완전히 사용할 수 있습니다.

당신이 사용할 수 있는 XML,too.그것은 열심히 설계하고 분석이지만,이 상품에 대한 리뷰가 없습니다.사람들은 그것을 사랑합니다.는 어떻게 개미와 메이븐(및 기타 많은 공구)선언 구문을 사용하여 설명하는 절차입니다.나는 그것을 권장하지 않기 때문에,그것은 고통을 말합니다.추천 단순히 사용하는 파이썬.

또는,당신은 당신이 갈 수있는 깊은 끝나고 자신을 발명 구문을 쓰기에 자신의 parser.

다른 팁

나는 생각한 우리는 비트가 필요한 더 많은 정보는 여기에 있습니다.알려주는 경우 다음과 같은 기초에 잘못된델 예측제어 등을 다룬다.

첫째,당신이 지적으로 자신이 이미 존재하는 DSL 를 선택하는 행에서 임의의 테이블-그것은"SQL".이후 원하지 않을 재발견하는 SQL,나는 가만 쿼리에서 한 테이블에 고정된 형식입니다.

이 경우,당신은 아마 없을 구현해야 DSL(지만 그것은 확실히 방법 중 하나로 이동);그것은 쉽게 될 수 있는 경우에,당신이 사용하는 개체 방향,필터를 만들 개체입니다.

더 많은 특히,"Filter"컬렉션하는 것이 하나 이상의 SelectionCriterion 개체입니다.을 구현할 수 있습니다 이를 상속에서 하나 이상의 기본을 나타내는 클래스를 선택 유형(범위,작음,ExactMatch,다음과 같,etc.) 일단 이러한 기본 클래스에있는 장소를 만들 수 있습니다,열 특정 상속 버전이 적절하는 열이 있습니다.마지막으로,의 복잡성에 따라 쿼리를 당신이 지원하려는,당신을 구현하고자하는 몇 가지 종류의 결합은 접착제를 처리하고 그리고 또는 그지 않은 연계 사이의 다양한 기준입니다.

같은 느낌이 경우,당신은 그것을 만들 수 있는 간단한 GUI 로드 컬렉션;나는 보면 필터에서 Excel 모델로는 경우에,당신은 아무것도 없어서 다른 마음입니다.

마지막으로,그것은 사소한의 내용을 변환 이 컬렉션에 해당하는 SQL,그리고 전달하는 데이터베이스에 있습니다.

그러나:는 경우에 당신은 후에,단순하고 귀하의 사용자가 이해할 SQL,당신은 단순히 그들에게 입에서의 내용을 정렬 프로그래밍 방식으로 구축의 나머지 부분은 쿼리가 있습니다.보안 측면에서,당신의 코드는 제어 열을 선택하고에서 절과 당신의 데이터베이스 권한을 제대로 설정,그리고 당신은 몇 가지 정신을 확인하는 문자열에서 들어오는 사용자의 경우,이 될 것이 상대적으로 안전하고 있습니다.

"구현하는 도메인 특정 언어로"

"아무도를 설치하려는 서버를 다운로드 및 실행되는 임의의 Python 에 코드를 런타임"

내가 원하는 DSL 그러나 나는 원하지 않는 파이썬하는 DSL.괜찮습니다.어떻게 당신은 실행이 DSL?What 런타임 허용하지 않는 경우는 파이썬?

는 무엇이 있는 경우는 C 프로그램 일이 포함 파이썬?는 것을 허용합니까?

하는 파이썬은 허용되지 않습 runtime--왜 이것이 하나요?

왜 만들지 않는 언어는"때 컴파일하고"생성 SQL 또는 어떤 질의어의 데이터 저장소이 필요?

당신은 것 기본적으로 만들기에 대한 추상적 개념임 지층이다.

당신이 언급한 Python.왜 사용하는 파이썬?할 수 있습니"형식에서"식의 DSL,그들은 형식에 있습니다.

당신은 몇 가지 규칙에서의 구조를 표현,하지만 그는 것보다 훨씬 쉽게 구현하는 새로운 무언가이다.

당신이 말한 아무도를 설치하려는 서버를 다운로드 및 사용하여 임의의 코드를 실행하게 수 있습니다.그러나,정확히 무엇 DSL 할 것입니다(결국)그래서 아마 하지 않습니다 그의 많은 차이가 있습니다.지 않는 한 당신이 뭔가를 특정 데이터와 함께 그때 나는 생각하지 않는 DSL 살 것입니다 당신은 그 많은 것이 좌절하는 사용자 이미 이에 정통한 SQL.과소평가하지 않는 크기의 작업을 당신에 복용.

당신의 질문에 대답 그러나 당신이 필요하의 문법에 대한 당신의 언어로,무언가를 분석하는 텍스트와 산책,나무 발광 코드 또는 API 를 호출하는 것을 서면(는 이유는 내 의견은 당신이 여전히 가을 발송하는 코드).

의 많음이 있는 교육에 텍스트 문법에 대한 수학적인 표현을 참조할 수 있는 인터넷에서 상당히직하고 있습니다.를 파서 생성기 도구 ANTLR 또는 Yacc 하는 데 사용할 수 있을 생성하는 데 도움이 되는 파서(또는 사용하는 언어는 다음과 같이 특징/구성과 결혼 두)입니다.오는 합리적인 SQL 문법이 쉽지 않을 것입니다.하지만 구글'BNF SQL'고 당신이 무엇을 가지고 올.

행운을 빕니다.

그것이 정말로 소리 같은 SQL,하지만 아마도 그것은 시도하는 가치가 SQLite 를 사용하는 경우에 당신은 그것을 유지하려는 간단하다?

그것은 당신 같은 소리를 만들고 싶어하지 않 DSL.나는 모양으로 ANTLR 는 것을 만들 수 있는 특정 파서는 텍스트를 해석하고 번역하는 특정 명령이 있습니다.ANTLR 제공합 라이브러리에 대한 Python,SQL,Java,C++,C,C#등등.

또한,여기에는 좋은 예의 ANTLR 엔진 계산 에서 만든 C#

Context-free 문법은 일반적으로는 나무 구조 및 기능적 프로그램에는 나무 구조처럼 너무입니다.내가 주장하지 않음을 것이 당신의 모든 문제를 해결하,그러나 그것은 좋은 방향으로 단계를 확신하는 경우에 당신을 사용하고 싶지 않은 뭔가 SQLite3.

from functools import partial
def select_keys(keys, from_):
    return ({k : fun(v, row) for k, (v, fun) in keys.items()}
            for row in from_)

def select_where(from_, where):
    return (row for row in from_
            if where(row))

def default_keys_transform(keys, transform=lambda v, row: row[v]):
    return {k : (k, transform) for k in keys}

def select(keys=None, from_=None, where=None):
    """
    SELECT v1 AS k1, 2*v2 AS k2 FROM table WHERE v1 = a AND v2 >= b OR v3 = c

    translates to 

    select(dict(k1=(v1, lambda v1, r: r[v1]), k2=(v2, lambda v2, r: 2*r[v2])
        , from_=table
        , where= lambda r : r[v1] = a and r[v2] >= b or r[v3] = c)
    """
    assert from_ is not None
    idfunc = lambda k, t : t
    select_k = idfunc if keys is None  else select_keys
    if isinstance(keys, list):
        keys = default_keys_transform(keys)
    idfunc = lambda t, w : t
    select_w = idfunc if where is None else select_where
    return select_k(keys, select_w(from_, where))

당신은 어떻게 확인하지 않은 것을 주는 사용자의 능력을 임의의 코드를 실행.이 프레임워크를 인정한 모든 가능한 기능이다.할 수 있고,오른쪽 래퍼로 그것을 통해 보안에 대한 노출하는 고정의 기능 목록을 개체를 사용할 수 있습니다.

ALLOWED_FUNCS = [ operator.mul, operator.add, ...] # List of allowed funcs

def select_secure(keys=None, from_=None, where=None):
    if keys is not None and isinstance(keys, dict):
       for v, fun keys.values:
           assert fun in ALLOWED_FUNCS
    if where is not None:
       assert_composition_of_allowed_funcs(where, ALLOWED_FUNCS)
    return select(keys=keys, from_=from_, where=where)

를 작성하는 방법 assert_composition_of_allowed_funcs.그것은 매우 어려운지는 파이썬지만 패키지.우리는 어디로 목록의 기능을 평가에서와 같은 형식 즉 where=(operator.add, (operator.getitem, row, v1), 2)where=(operator.mul, (operator.add, (opreator.getitem, row, v2), 2), 3).

프로그램 작성이 가능하기 때문 작성 apply_lisp 기능하는지 확인하는 기능이만의 ALLOWED_FUNCS 또는 상수처럼 float,int,str.

def apply_lisp(where, rowsym, rowval, ALLOWED_FUNCS):
    assert where[0] in ALLOWED_FUNCS
    return apply(where[0],
          [ (apply_lisp(w, rowsym, rowval, ALLOWED_FUNCS)
            if isinstance(w, tuple)
            else rowval if w is rowsym
            else w if isinstance(w, (float, int, str))
            else None ) for w in where[1:] ])

고객께,당신은 또한 필요를 확인하에 대한 정확한 형태,원하지 않기 때문에 당신의 형식을 무시됩니다.그래서 사용하지 않는 isinstance, 용 type in (float, int, str).소년 오는 우리가 실행으로:

Greenspun 의 열 번째 규칙의 프로그래밍:모든 충분히 복잡한 C 또는 프로그램은 프로그램을 포함하는 임시 비공식적으로 지정 버그-탈린의 구현은 반의 일반적인 패키지.

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