我已经制作了这个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。
希望有人能帮助我并理解我想说的话。 谢谢!
答案 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} }
在这种情况下,您可以分配(并检索回)单个实例而不是列表。
希望它清楚!