2017-02-15 4 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 
関連する問題