It's not the append that's causing the error, it's the fact that you're creating a new Creator() instance, which ultimately results in an INSERT statement being issued.
You want to append a Creator instance to `company.creator`, but you don't necessarily want to make a new Creator every time you instantiate a Company. If a Creator with the given name already exists, you'll want use that instead. So, roughly: class Company(Base): __tablename__ = "companies" id = Column(Integer, primary_key = True) company = Column(String(100), unique=True, nullable=False) creator = relationship("Creator", backref="companies", cascade="all") def __init__(self, company, creator): self.company = company existing_creator = DBSession(Creator).query.filter_by(name=creator).first() self.creator.append(existing_creator or Creator(creator)) -- Tim Van Steenburgh On Monday, August 12, 2013 at 9:41 PM, csdr...@gmail.com wrote: > Sorry I don't understand what you're trying to say. > > If the Creator already exists, and I'm to append it again, isn't that the > same as what my code is currently doing? (That is, appending in every > instance.) I don't see how this wouldn't result in the same error message. > > And what would it mean to create a new one and append that? I don't know what > this code would look like. > > Apologies if I'm being dense. > > On Monday, August 12, 2013 9:33:31 PM UTC-4, Tim wrote: > > In `Company.__init__()`, instead of blindly creating a new `Creator` > > instance, you need to first query for an existing Creator with that name. > > If it exists, append it, otherwise, create a new one and append that. > > > > -- > > Tim Van Steenburgh > > > > > > On Monday, August 12, 2013 at 9:26 PM, csd...@gmail.com (javascript:) wrote: > > > > > I have another question about a piece of code that I posted the other > > > day. Namely, I have a one-to-many relationship between Creator and > > > Company. A Creator can have a relationship with multiple Companies but > > > any one Company can have a relationship with only one Creator. > > > > > > class Company(Base): > > > __tablename__ = "companies" > > > id = Column(Integer, primary_key = True) > > > company = Column(String(100), unique=True, nullable=False) > > > creator = relationship("Creator", backref="companies", cascade="all") > > > > > > > > > def __init__(self, company, creator): > > > self.company = company > > > self.creator.append(Creator(creator)) > > > > > > class Creator(Base): > > > __tablename__ = "creators" > > > > > > company_id = Column(Integer, ForeignKey('companies.id > > > (http://companies.id/)')) > > > creator = Column(String(100), nullable=False, unique=True) > > > > > > def __init__(self, creator): > > > self.creator = creator > > > > > > > > > So, to create a Company, the code calls company = Company(<company name>, > > > <creator name>) and that in turn calls Creator(). > > > > > > The problem is that the Companies get added one by one, and if a new > > > company being entered has a Creator with a name of a preexisting company, > > > SQLalchemy errors due to the unique=True flag: > > > > > > sqlalchemy.exc.IntegrityError: (IntegrityError) (1062, "Duplicate entry > > > 'Viking' for key 'creator'") 'INSERT INTO creators (company_id, creator) > > > VALUES (%s, %s)' (17L, u'Viking') > > > > > > If unique=True isn't enabled, it will create another Creator of the same > > > name. Instead, the code should reflect the additional Company assigned to > > > this particular Creator. How might I go about fixing this? > > > > > > Thanks! > > > > > > -- > > > You received this message because you are subscribed to the Google Groups > > > "sqlalchemy" group. > > > To unsubscribe from this group and stop receiving emails from it, send an > > > email to sqlalchemy+...@googlegroups.com (javascript:). > > > To post to this group, send email to sqlal...@googlegroups.com > > > (javascript:). > > > Visit this group at http://groups.google.com/group/sqlalchemy. > > > For more options, visit https://groups.google.com/groups/opt_out. > > > > > > > > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com > (mailto:sqlalchemy+unsubscr...@googlegroups.com). > To post to this group, send email to sqlalchemy@googlegroups.com > (mailto:sqlalchemy@googlegroups.com). > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/groups/opt_out. > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/groups/opt_out.