2009-06-24 3 views
1

사용자가 송장을 저장할 때 에 할당해야하는 "번호"특성을 가진 간단한 "송장"클래스가 있습니다. 일부 제약이 있습니다SQLAlchemy에서 사용자 지정 논리를 사용하여 자동 증가 특성

1) 응용 프로그램이 (얇은) ​​클라이언트 - 서버 하나, 그래서 어떤 이 수는 충돌
2) 송장에 "버전"너무 속성이 피려합니다 할당, 그래서 DBMS 레벨 자동 증가 필드

나는 인보이스가 저장 될 때마다 실행되는 사용자 정의 유형을 사용하여 빌드하려고합니다. process_bind_param이 None 값으로 호출 될 때마다 수를 판별하고 충돌을 피하기 위해 일종의 싱글 톤을 호출합니다. 이것은 괜찮은 해결책입니까? 어쨌든, 나는 .. 문제가 있어요 여기에 내 사용자 지정 유형입니다 :

class AutoIncrement(types.TypeDecorator): 
    impl = types.Unicode 

    def copy(self): 
     return AutoIncrement() 

    def process_bind_param(self, value, dialect): 
     if not value: 
      # Must find next autoincrement value 
      value = "1" # Test value :) 
     return value 

내 문제는 바로 지금입니다 나는 그것의 번호, 송장 예를 들어 값으로 세트를 "1"송장을 저장하고 자동 증가 할 때 이 아니며 은 새 번호로 업데이트됩니다. 예상 되나요? 내가 누락되었습니다 뭔가? 시간 내 주셔서 감사합니다. (PostgreSQL을 8.3을 사용하여 파이썬 2.6에 SQLA 0.5.3)

편집 : TypeDecorators는 기본 값으로 취급하지 않기 때문에 마이클 바이엘,이 동작이 예상된다 내게 말했다.

답변

3

default= 매개 변수를 열 정의에 사용하지 않는 특별한 이유가 있습니까? (임의의 파이썬 호출 가능).

def generate_invoice_number(): 
    # special logic to generate a unique invoice number 

class Invoice(DeclarativeBase): 
    __tablename__ = 'invoice' 
    number = Column(Integer, unique=True, default=generate_invoice_number) 
    ... 
+0

부탁드립니다. 부탁드립니다. 부탁드립니다. 바로 시도해 보겠습니다 :) – Joril

+0

기본 호출 가능 함수는 DB에있는 열의 최대 값을 더한 값을 반환합니다. 고유 한 열의 오류에 의존하지 않고 경쟁 조건이 없다고 주장 할 수있는 방법이 있습니까? –

+0

그런 경우 인라인 SQL 표현식으로 기본값을 작성하는 것이 좋습니다. 자세한 내용은 http://www.sqlalchemy.org/docs/05/metadata.html#pre-executed-and-inline-sql-expressions의 SQLAlchemy 문서 –

관련 문제