Oh, it seems that merge() actually does populate the b_id if that B is 
non-conflicting... Seems I have another problem . 
Thank you anyway, Michael

вторник, 14 апреля 2015 г., 20:08:04 UTC+5 пользователь Michael Bayer 
написал:
>
>  
>
> that's not what I see happening here.   I see very simply that the B.id_ 
> column is a SERIAL so is linked to a sequence, however you are inserting a 
> row with a hardcoded "1" for a primary key; so the second B object, which 
> relies on the sequence, fails due to an identity conflict.
>
> So let's repair the test case first, and that first B.id we'll set to "10" 
> so that it doesn't conflict.
>
> Now we get the error you probably intended to send:
>
> SELECT "Rel".id_a AS "Rel_id_a", "Rel".id_b AS "Rel_id_b", "Rel".rel_data 
> AS "Rel_rel_data" 
> FROM "Rel" 
> WHERE "Rel".id_a = %(param_1)s AND "Rel".id_b = %(param_2)s
> 2015-04-14 11:05:11,850 INFO sqlalchemy.engine.base.Engine {'param_1': 
> 800, 'param_2': symbol('NEVER_SET')}
>
> where this is, the merge() is proceeding to attempt to locate the object 
> by primary key but the PK is not filled in.  This is the expected 
> behavior.   The primary key of an object is never auto-populated until it 
> is flushed.   So here, if you are passing in a transient object, you need 
> to set the PK yourself:
>
> second_b = B(data='foooo')
> session.add(second_b)
> session.flush()
> x = session.merge(Rel(id_a=800, rel_data="second", id_b=second_b.id_))
>
>
>
> 

-- 
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