2010-06-01 8 views
1

Ceci est une question de niveau débutant.Relation plusieurs-à-un dans SQLAlchemy

J'ai un catalogue de mtypes:

mtype_id name 
     1 'mtype1' 
     2 'mtype2' 
[etc] 

et un catalogue d'objets, qui doit avoir un mtype associé:

obj_id mtype_id name 
    1  1 'obj1' 
    2  1 'obj2' 
    3  2 'obj3' 
[etc] 

Je suis en train de le faire dans SQLAlchemy en créant les éléments suivants schémas:

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")} 
) 

Lorsque je tente d'ajouter un élément simple comme:

mtype1 = MType('mtype1') 
obj1 = MyObject('obj1') 
obj1.mtype=mtype1 
session.add(obj1) 

Je reçois l'erreur:

AttributeError: 'NoneType' object has no attribute 'cascade_iterator' 

Toutes les idées?

+0

Ce serait bien de voir la trace complète au moins ou même un échantillon complet de code pour reproduire le problème. –

Répondre

0

Je suis en mesure d'exécuter le code que vous avez indiqué ci-dessus donc je suppose que le problème était supprimé lorsque vous l'avez simplifié dans le but de cette question. Est-ce exact?

Vous n'avez pas montré de traceback donc seulement quelques conseils généraux peuvent être donnés.

Dans SQLAlchemy (au moins dans 0.5.8 et au-dessus) il y a seulement deux objets avec l'attribut "cascade_iterator": sqlalchemy.orm.mapper.Mapper et sqlalchemy.orm.interfaces.MapperProperty. Comme vous n'avez pas obtenu l'exception sqlalchemy.orm.exc.UnmappedClassError (tous les mappeurs sont exactement là où ils devraient être), je devine que le code interne de sqlalchemy obtient None quelque part où il devrait obtenir une instance de MapperProperty à la place.

Mettez quelque chose comme ça juste avant session.add() qui a fait l'exception:

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)] 

puis utilisez votre méthode préférée (impression, -m python, pdb.set_trace(), ...) pour vérifier la valeur de invalid_prop. Il est probable que pour une raison ou pour une autre, ce ne sera pas None et votre menteur est là.

Si type (invalid_prop) est un sqlalchemy.orm.properties.RelationshipProperty alors vous avez introduit un bogue dans la configuration du mapper (pour la relation appelée invalid_prop.key). Sinon, c'est difficile à dire sans plus d'informations.

Questions connexes