Domanda

Questa è una domanda di livello principiante.

Ho un catalogo di mtypes:

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

e un catalogo di oggetti, che deve avere un mtype associati:

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

sto cercando di farlo in SQLAlchemy creando i seguenti schemi:

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

Quando provo ad aggiungere un elemento semplice come:

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

ottengo l'errore:

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

Tutte le idee?

È stato utile?

Soluzione

Hai provato:

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

invece che:

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

Vedi anche: http: // www.sqlalchemy.org/docs/05/reference/sqlalchemy/schema.html#sqlalchemy.schema.ForeignKey

Altri suggerimenti

Sono stato in grado di eseguire il codice che avete mostrato sopra quindi credo che il problema è stato rimosso quando si semplificò per lo scopo di questa domanda. E 'corretto?

Non hai mostra un traceback in modo che solo alcuni consigli generali possono essere dato.

In SQLAlchemy (almeno in 0.5.8 e sopra) ci sono solo due oggetti con attributo "cascade_iterator":. Sqlalchemy.orm.mapper.Mapper e sqlalchemy.orm.interfaces.MapperProperty

Dal momento che non ha ottenuto eccezione sqlalchemy.orm.exc.UnmappedClassError (tutti mapper sono proprio dove dovrebbero essere) la mia supposizione è che un certo codice sqlalchemy interno ottiene Niente da qualche parte dove si dovrebbe ottenere un'istanza MapperProperty invece.

qualcosa di Put di simile poco prima session.add () chiamata che causa l'eccezione:

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

e quindi utilizzare il metodo preferito (stampa, pitone -m, pdb.set_trace (), ...) per controllare il valore di invalid_prop. E 'probabile che per qualche motivo non sarà nessuno e non vi si trova la vostra colpevole.

Se il tipo (invalid_prop) è uno sqlalchemy.orm.properties.RelationshipProperty allora avete introdotto un bug in configurazione mapper (per quanto riguarda il nome invalid_prop.key). Altrimenti è difficile dire, senza ulteriori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top