0

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

私は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'

何か案は?

4

2 に答える 2

2

やってみました:

Column('mtype_id', ForeignKey('mtypes.mtype_id')),

それ以外の:

Column('mtype_id', None, ForeignKey('mtypes.mtype_id')),

参照:https ://docs.sqlalchemy.org/en/13/core/constraints.html

于 2010-06-02T11:56:06.813 に答える
0

上に示したコードを実行できたので、この質問の目的で単純化したときに問題が解消されたと思います。あれは正しいですか?

トレースバックを表示しなかったため、いくつかの一般的なヒントのみを提供できます。

SQLAlchemy(少なくとも0.5.8以降)では、「cascade_iterator」属性を持つオブジェクトはsqlalchemy.orm.mapper.Mapperとsqlalchemy.orm.interfaces.MapperPropertyの2つだけです。

sqlalchemy.orm.exc.UnmappedClassError例外が発生しなかったため(すべてのマッパーは適切な場所にあります)、私の大げさな推測では、一部の内部sqlalchemyコードは、代わりにMapperPropertyインスタンスを取得する必要がある場所でNoneを取得します。

例外を引き起こす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の値を確認します。何らかの理由でNoneではなく、犯人がいる可能性があります。

type(invalid_prop)がsqlalchemy.orm.properties.RelationshipPropertyの場合、マッパー構成にバグが発生しています(invalid_prop.keyという名前のリレーションの場合)。そうでなければ、より多くの情報なしで見分けるのは難しいです。

于 2010-06-07T15:00:06.403 に答える