Sqlalchemyにおける多くの関係
-
22-10-2019 - |
質問
これは初心者レベルの質問です。
mtypesのカタログがあります:
mtype_id name
1 'mtype1'
2 'mtype2'
[etc]
そして、関連するMTypeが必要なオブジェクトのカタログ:
obj_id mtype_id name
1 1 'obj1'
2 1 'obj2'
3 2 'obj3'
[etc]
私は次のスキーマを作成することにより、SQLalchemyでこれをやろうとしています。
mtypes_table = Table('mtypes', metadata,
Column('mtype_id', Integer, primary_key=True),
Column('name', String(50), nullable=False, unique=True),
)
objs_table = Table('objects', metadata,
Column('obj_id', Integer, primary_key=True),
Column('mtype_id', None, ForeignKey('mtypes.mtype_id')),
Column('name', String(50), nullable=False, unique=True),
)
mapper(MType, mtypes_table)
mapper(MyObject, objs_table,
properties={'mtype':Relationship(MType, backref='objs', cascade="all, delete-orphan")}
)
次のような単純な要素を追加しようとするとき:
mtype1 = MType('mtype1')
obj1 = MyObject('obj1')
obj1.mtype=mtype1
session.add(obj1)
エラーが発生します:
AttributeError: 'NoneType' object has no attribute 'cascade_iterator'
何か案は?
解決
やってみました:
Column('mtype_id', ForeignKey('mtypes.mtype_id')),
それ以外の:
Column('mtype_id', None, ForeignKey('mtypes.mtype_id')),
参照: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/schema.html#sqlalchema.schema.foreignkey
他のヒント
上記のコードを実行することができたので、この質問の目的で簡略化したときに問題が削除されたと思います。あれは正しいですか?
トレースバックは見せなかったので、いくつかの一般的なヒントだけを与えることができます。
Sqlalchemy(少なくとも0.5.8以降)には、「cascade_iterator」属性:sqlalchemy.orm.mapper.mapperおよびsqlalchemy.orm.orfaces.mapperpropertyを持つオブジェクトは2つしかありません。
sqlalchemy.orm.exc.unmappclasserrorの例外を取得できなかったため(すべてのマッパーは正しい場所にあります)、私のワイルドな推測では、一部の内部sqlalchemyコードは代わりにMapperPropertyインスタンスを取得する必要があります。
session.add()の直前にこのようなものを置きます。
from sqlalchemy.orm import class_mapper
from sqlalchemy.orm.interfaces import MapperProperty
props = [p for p in class_mapper(MyObject).iterate_properties]
test = [isinstance(p, MapperProperty) for p in props]
invalid_prop = None
if False in test:
invalid_prop = props[test.index(False)]
次に、お気に入りの方法(print、python -m、pdb.set_trace()、...)を使用して、invalid_propの値を確認します。何らかの理由でそれは誰にも負けず、あなたの犯人が存在する可能性があります。
Type(Invalid_Prop)がsqlalchemy.orm.properties.relationshippropertyの場合、マッパー構成のバグを導入しました(invalid_prop.keyという名前の関係について)。それ以外の場合は、詳細情報なしでは伝えるのが難しいです。