SqlAlchemy TypeError:不兼容的集合类型:Line不是类似列表的

时间:2018-01-15 15:02:07

标签: python sqlalchemy

我已经制作了这个Schema和Insertion,我在Line和Bar之间建立了关系,并且每个Bar都与NameBar有关系(这只是一个简历模式)。我的问题是每次我尝试插入时都会遇到如何建立关系的问题,这是我第一次使用SQLAlchemy并做一些事情。

模式

class Line(Base):
   __tablename__ = 'line' # Nombre de la tabla 

   id = Column(Integer, primary_key = True)
   fechaEntrada = Column(DateTime, default = datetime.utcnow)
   nameLine = Column(String(250))
   bar_id = Column(Integer, ForeignKey('bar.id'))

   bar = relationship("Bar", foreign_keys = 'Line.bar_id', backref = 'relat') 

class Bar(Base):
   __tablename__ = 'bar'
   id = Column(Integer, primary_key = True)
   zona = Column(String(250))
   nameBar_id = Column(Integer, ForeignKey('nameBar.id'))
   line_id = Column(Integer, ForeignKey('line.id'))

   nameBar = relationship("NameBar", foreign_keys = 'Bar.nameBar_id' , backref = 'rela')
   line = relationship("Line", foreign_keys = 'Bar.line_id') # Relacion con la linea

class NameBar(Base):
   __tablename__ = 'nameBar'
   id = Column(Integer, primary_key = True)
   nameBar1 = Column(String(250))
   nameBar2 = Column(String(250))
   bar_id = Column(Integer, ForeignKey('bar.id'))

   bar = relationship("Bar", foreign_keys = 'NameBar.bar_id')

插入

  newLine = Line(fechaEntrada = '2017-01-01 12:00:00', nameLine = 'Lala')
  newBar = Bar(zona = 'uuh', relat = newLine)
  newNameBar = NameBar(rela = newBar , nameBar1 = 'hi', nameBar2 = 'hi2')

  session.add(newLine)
  session.add(newNameBar)
  session.add(newBar)
session.commit()

所以,我试图在这里做的事情是这样的;每次我有nameLine时我也想插入Bar的名称,所以我想在插入newLine时插入nameBar,这样我就可以获得与Bar相关的关系和id。

希望有人能帮助我并理解我想说的话。 谢谢!

1 个答案:

答案 0 :(得分:3)

我认为你得到的错误是因为SQLAlchemy期望Bar和Line之间存在一对多的关系,因此一个Bar有很多行。因此,bar.relat将是一个Lines列表,而不仅仅是一个实例。

所以当你尝试newBar = Bar(zona = 'uuh', relat = newLine)时 SQLAlchemy需要一个newLines列表,用于" relat" kwarg并抱怨它。

请尝试改为:

newBar = Bar(zona = 'uuh', relat = [newLine])

或者,对于您不想要一对多但一对一的关系的情况,您应该使用uselist=False kwarg进行relationship()调用,请参阅:{{3} }

在这种情况下,您可以分配(并检索回)单个实例而不是列表。

希望它清楚!