On 12/11/2015 05:25 PM, Gerald Thibault wrote:
> I am basing my question off the code
> at 
> http://docs.sqlalchemy.org/en/latest/orm/relationship_persistence.html#rows-that-point-to-themselves-mutually-dependent-rows,
> with a few changes.
> 
> I am trying to handle a situation very similar to the one in that
> example, with 2 classes having the same relationship types as those in
> the example. However, I would like to create the instances without using
> the relationships, and instead populate the fk values directly. The
> example uses this, and it works.
> 
> w1 = Widget(name='somewidget')
> e1 = Entry(name='someentry')
> w1.favorite_entry = e1
> w1.entries = [e1]
> session.add_all([w1, e1])
> session.commit()
> 
> I would like to do this:
> 
> w1 = Widget(widget_id=1, favorite_entry_id=1, name='somewidget')
> e1 = Entry(entry_id=1, widget_id=1, name='someentry')
> session.add_all([w1, e1])
> session.commit()
> 
> The reason I am doing it this way is because I am operating from a JSON
> fixture file, and trying to populate a database for unit testing. The
> method used in the example works perfectly, but trying to do it my way
> yields:
> 
> sqlalchemy.exc.IntegrityError: (IntegrityError) (1452, 'Cannot add or
> update a child row: a foreign key constraint fails (`test`.`widget`,
> CONSTRAINT `fk_favorite_entry` FOREIGN KEY (`favorite_entry_id`)
> REFERENCES `entry` (`entry_id`))') 'INSERT INTO widget (widget_id,
> favorite_entry_id, name) VALUES (%s, %s, %s)' (1, 1, 'somewidget')
> 
> I understand the post_update option is on the relationship, and not the
> column, so it has no effect on column population. Is there an
> alternative method to have that column populated separately via a second
> statement, similar to the post_update functionality?

Sure, you have to do it manually:

w1 = Widget(widget_id=1, favorite_entry_id=None, name='somewidget')
e1 = Entry(entry_id=1, widget_id=1, name='someentry')
session.add_all([w1, e1])
session.flush()  # optional if you're on autoflush
session.query(Widget).filter_by(widget_id=1).update(favorite_entry_id=1)
session.commit()







> 
> -- 
> 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/d/optout.

-- 
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/d/optout.

Reply via email to