質問

これは初心者レベルの質問です。

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という名前の関係について)。それ以外の場合は、詳細情報なしでは伝えるのが難しいです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top