2013-09-06 9 views
7

나는 이미 SQLAlchemy 테이블 정의를 사용하는 프로젝트에 Alembic을 통합하기 시작했습니다. 현재 내 DB 스키마는 내 응용 프로그램 외부에서 관리되며 전체 스키마를 내 테이블 정의 파일로 가져 오려고합니다.SQLAlchemy에서 사용자 정의 PostgreSQL 도메인을 나타내는 방법은 무엇입니까?

PostgreSQL에서는 전자 메일 주소를 저장하기 위해 사용자 지정 도메인을 사용합니다. PostgreSQL의 DDL은 다음과 같습니다

CREATE DOMAIN email_address TEXT CHECK (value ~ '[email protected]+') 

어떻게 SQLAlchemy의에서이 도메인의 생성 및 열 데이터 유형으로 그것의 사용을 표시합니까?

+1

이 질문은 좀 더 진보 된 것 같습니다. 아마도 SQLAlchemy 목록에서 더 나은 도움을 얻을 수 있습니다. 유형의 사용법에 대해서는'TEXT'를 서브 클래스 화하고 그 이름을'email_address'로 변경하는 방법을 찾길 권한다. 이것은 가장 간단한 방법 일 것이다 (그러나 나는 그것을하는 방법을 모른다). SQLAlchemy가 아직 존재하지 않는 유형을 생성하기위한 인터페이스를 가지고 있는지 확실하지 않기 때문에 후자 부분은 아마도 리터럴 SQL로 수행 할 수 있습니다. – javex

+0

@javex 지금은 맞춤 DDL을 발행하여 도메인을 만들고 있는데,'UserDefinedType'을 하위 클래스로 분류하여 해당 열 유형 정의에'email_address'를 반환했습니다. 이상적이지는 않지만 충분히 잘 작동합니다. SQLA 목록을 확인할 수 있습니다.이 제안에 감사드립니다. – skyler

답변

0

이것은 실제 해결책에서 멀리 떨어져있을 가능성이 있지만이 작업을 수행하는 가장 좋은 방법은 서브 클래스 sqlalchemy.schema._CreateDropBase입니다.

from sqlalchemy.schema import _CreateDropBase 

class CreateDomain(_CreateDropBase): 
    '''Represent a CREATE DOMAIN statement.''' 

    __visit_name__ = 'create_domain' 

    def __init__(self, element, bind=None, **kw): 
     super(CreateDomain, self).__init__(element, bind=bind, **kw) 

class DropDomain(_CreateDropBase): 
    '''Represent a DROP BASE statement.''' 

    __visit_name__ = 'drop_domain' 

    def __init__(self, element, bind=None, **kw): 
     super(DropDomain, self).__init__(element, bind=bind, **kw) 

@compiles(CreateDomain, 'postgresql') 
def visit_create_domain(element, compiler, **kw): 
    text = '\nCREATE DOMAIN %s AS %s' % (
     compiler.prepare.format_column(element.name), 
     compiler.preparer.format_column(element.type_)) # doesn't account for arrays and such I don't think 

    default = compiler.get_column_default_string(column) 
    if default is not None: 
     text += " DEFAULT %s" % default 

    return text 

분명히 이것은 불완전하지만 분명히 충분히 원한다면 좋은 출발점이되어야합니다. :)