SQLAlchemy: InstrumentList nicht iterierbar?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
sonovice
User
Beiträge: 10
Registriert: Sonntag 17. Februar 2013, 20:06

Hallo wieder einmal,

folgender Code (Minimalbeispiel)

Code: Alles auswählen

from sqlalchemy import create_engine, ForeignKey
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker

engine = create_engine('sqlite:///microphones.db', echo=True)
Base = declarative_base()


class Manufacturer(Base):
    __tablename__ = 'manufacturer'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    microphones = relationship('Microphone', backref='manufacturer')

    def __init__(self, name):
        self.name = name


class Microphone(Base):
    __tablename__ = 'microphone'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    comment = Column(String)

    manufacturer_id = Column(Integer, ForeignKey('manufacturer.id'))


    def __init__(self, name, comment=''):
        self.name = name
        self.comment = comment


Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

manufacturer_test = Manufacturer('Neumann')
manufacturer_test.microphones.extend(Microphone('KM 1')) # <------- FEHLER

session.add(manufacturer_test)
session.commit()
führt in der markierten Zeile am Ende zur Fehlermeldung

Code: Alles auswählen

TypeError: 'Microphone' object is not iterable
Die Docs von SQLAlchemy behaupten allerdings, dass die Objekte im Allgemeinen in Listen untergebracht werden. "microphones" ist auch vom Typ "InstrumentedList". Warum also der Fehler?
BlackJack

@sonovice: Du erstellst mit ``Microphone('KM 1')`` *ein* Mikrofon-Objekt. Warum sollte das Deiner Meinung nach iterierbar sein? Was sollten denn die enthaltenen Objekte sein? Also was würdest Du hier als Ausgabe erwarten, wenn es denn iterierbar wäre:

Code: Alles auswählen

for item in Microphone('KM 1'):
    print item
Kann es sein, dass Du `extend()` und `append()` verwechselst?
sonovice
User
Beiträge: 10
Registriert: Sonntag 17. Februar 2013, 20:06

BlackJack hat geschrieben:Kann es sein, dass Du `extend()` und `append()` verwechselst?
Autsch... :oops:

Danke für die zügige Hilfe!
Antworten