2017-02-15 19 views
0

열 이름과 해당 유형 집합이 주어지면 목표는
으로 테이블과 해당 매핑 된 클래스를 인스턴스화하는 것입니다.Sqlalchemy 동적으로 테이블 및 매핑 된 클래스를 만듭니다.

여기에 게시 된 질문과 관련이 있습니다 : Dynamic Class Creation in SQLAlchemy.

table = Table(tbl, 
       metadata, 
      *(Column(col, ctype, primary_key=pk, index=idx) for col, ctype, pk, idx in zip(attrs, types, primary_keys, indexes)) 
      ) 

이 테이블 객체를 생성 :

지금까지 나는 다음 있습니다. 이제 해당 클래스를 만들어야합니다.

mydict={'__tablename__':tbl} 
cls = type(cls_name, (Base,), mydict) 

이 나에게 다음과 같은 오류를 제공합니다 :

ArgumentError: Mapper Mapper|persons_with_coord|t_persons_w_coord could not assemble any primary key columns for mapped table

내 질문은 내가 클래스 작성의 일부로서 기본 키를 지정합니까 방법이다. 그리고 클래스를 만든 후 나는 다음과 같이 매퍼를 호출해야 할 :

mapper(cls, table) 

답변

0

mydict 매핑 중 하나를 테이블에 객체를 포함하거나 테이블이 데이터베이스에서로드 할 필요가 있음을 지정할 수 있습니다.

이것은 당신이 table를 만들 때이 또한 기본 키가 이미 지정되어

mydict={'__tablename__':tbl, '__table_args__': ({'autoload':True},)} 

작동합니다

mydict={'__tablename__':tbl, '__table__': table} 

작동합니다. 선언을 작성할 때 다시 지정할 필요는 없지만 복잡한 키의 경우에는 __table_args__으로 지정해야합니다.

매퍼는 선언적 클래스에서 호출되어야합니다. 그러나 새로 작성된 선언문에는 메타 데이터 오브젝트가 없습니다. 메타 데이터를 추가하면 동적으로 생성 선언적 행동하라 일반 선언 같은 를 만들 것입니다, 그래서

cls.metadata = cls.__table__.metadata 

그래서, 전체 편집이 될 수 클래스 생성 한 후이 줄을 두는 것이 좋습니다 :

mydict={'__tablename__':tbl, '__table__': table} 
cls = type(cls_name, (Base,), mydict) 
cls.metadata = cls.__table__.metadata