2017-04-07 9 views
1

나는 (InnoDB를 실행하는) MySQL을 사용하고 있고, sqlalchemy를 사용하여 전체를 감쌌다. 지금, 나는 (docs 참조)slqlalchemy UniqueConstraint VS 인덱스 (unique = True)

sqlalchemy_utils.functions.create_database(...) 

일반적으로 위의 기능이하도록되어 무엇을합니까 사용하여 내 데이터베이스의 변화를 생성하고 싶습니다. 유일한 예외는 유일한 색인 생성입니다.

말은,이 같은 테이블을 정의 :

## ... 
# DeclBase = declarative_base() 
## ... 
class MyTable(DeclBase): 
    __tablename__ = 'my_table' 

    id = Column(Integer, primary_key=True) 
    attr_1 = Column(String(32)) 
    attr_2 = Column(Integer, nullable=False) 
    attr_3 = Column(DateTime) 
    attr_4 = Column(
     Integer, 
     ForeignKey('other_table.id', onupdate='CASCADE', ondelete='CASCADE'), 
     nullable=False 
    ) 

    u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx') 

내가 지정된 모든 열이 테이블 'MY_TABLE'을 만들 수 SQLAlchemy의를 얻을 것이다 CREATE_DATABASE 전화

. 외래 키도 제대로 설정되었지만 데이터베이스 측에서 고유 인덱스를 찾을 수는 없습니다. 나는 대신 Index (unique = True)를 사용하여 시도했다. 그래서 그 대신

u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx') 

의 내가

u_idx_1 = Index('my_table_uidx', attr_2, attr_3, unique=True) 

을 넣어 내 인상이 논리적으로 비슷한 결과를 생산했다. 이번에는 sqlalchemy가 db에 고유 인덱스를 만들었습니다.

아마도 UniqueConstraint와 Index (unique = True) 사이의 차이점이나 sqlalchemy가 데이터베이스 생성을 자동화하는 방법과 관련하여 뭔가 오해하고 있습니다.

누구든지이 문제에 대해 의견을 개진 할 수 있습니까?

답변

2

주요 차이점은 Index API은 일반적 must be defined inline in the table definition에서 전달 SQL 구조 통해 UniqueConstraint와 제약 조건 테이블을 참조 할 수있는만큼의 테이블 정의의 외부 인덱스를 정의 할 수 있지만 :

을 위해 ForeignKeyConstraint과 같은 테이블 수준 제약 조건 개체를 Declarative를 사용하여 정의 된 테이블에 적용하려면 Table Configuration에 설명 된 __table_args__ 특성을 사용하십시오.

이해하는 것은 명시 적 __table__을 통과하지 않을 경우 선언 클래스의 건설 중에 새 Table가 구성되어 있다는 점이다. 예제 모델 클래스에서 UniqueConstraint 인스턴스는 클래스 특성에 바인딩되지만 선언 기반은 특성에서 생성 된 Table 인스턴스의 제약 조건을 포함하지 않습니다. 테이블 인수로 전달해야합니다.

class MyTable(DeclBase): 
    __tablename__ = 'my_table' 
    ... 
    # A positional argument tuple, passed to Table constructor 
    __table_args__ = (
     UniqueConstraint(attr_2, attr_3, name='my_table_uidx'), 
    ) 

키워드 인수로 제약 조건 이름을 전달해야합니다. 테이블을 만들려고 시도하기 전에 Table.append_constraint()을 사용하여 제약 조건을 전달할 수도 있습니다.

class MyTable(DeclBase): 
    ... 

MyTable.__table__.append_constraint(
    UniqueConstraint('attr_2', 'attr_3', name='my_table_uidx')) 
+0

큰 설명! 그것은 많은 의미가 있습니다. Index ('my_table_uidx', attr_2, attr_3, unique = True) 구현을 고수하는 것에 대한 논쟁이 있습니까? 필자는 이전에 MySQL Workbench에서 수동으로 설정 한 MySQL 정의와 똑같은 MySQL 정의를 생성 했으므로 필자는 그것을 유지하는 편이 낫습니다. 또한 파이썬 측면에서 읽기 쉽도록했습니다. –

+0

MySQL을 사용하는 경우에는 둘 중 하나를 선호 할 이유가 없습니다. 이것을 인용하지 마십시오. 그러나 고유 한 제약 조건은 고유 인덱스로 구현됩니다. 모든 데이터베이스에서 동일하게 적용되지는 않습니다. 다시 한 번 확실하게 SQL 표준에 익숙하지 않습니다. –

+0

충분합니다. 그것은 내 직감이었습니다. 그렇지 않으면 제안하는 항목을 발견하면 게시 할 것입니다. 감사! –