[PonyORM-list] get PK of the record before committing it to DB

Вадим Бажов vadim at ideco.ru
Fri Mar 27 11:32:17 UTC 2015

It doesn't work for me.

I have a Customers entity with 'licences' field as Set which is in 
relation with Licences entity which have back relation field 'customer' 
as Required(Customers).

Hence i must supply customer's id for 'customer' field while add licence 
to a customer object.

I must do the following:

cust = Customer(name='asd',email='asd at qwe.com') <- it doesn't create id
before commiting it.

lic = cust.licences.add(
     customer=cust.id, <- required filed in DB model. related to 
Customers record by PK.

But newly created object has no id since it wasn't written to DB yet.

May be Pony allows child entities without Required fields linking entity 
back to a parent entity, but i didn't try it.

On 25.03.2015 11:03, Matthew Bell wrote:
> You don't need the PK to add a relation, you can do:
> cust = Customers(name='GazMyas',city='Chelyabinsk')
> cust.licenses.add(License(x=1, y=2))
> cust.licenses.add(License(x=3, y=4))
> So, create the customer, then loop over all licenses for that 
> customer, doing customer.licenses.add
> You can then commit after each iteration, or just once at the end of 
> the script, up to you.
> On 25 March 2015 at 08:28, Вадим Бажов <vadim at ideco.ru
> <mailto:vadim at ideco.ru>> wrote:
>     Hello happy pony users and devs !
>     I do an import from old db to a new one, driven by pony orm.
>     Import iterates over records of customers and their related
>     licences, fetched from an old DB. So we have to fill two tables in
>     new DB: Customers table and Licence table with records, which have
>     one2many relations (one Customer can have many Licences, by PK).
>     PK is an autoincrementing integer in both tables.
>     Within *each iteration* of import i need to write one Customer
>     record and its Licences records to new DB. Licence records should
>     have customer_id fields filled up with corresponding Customer PKs.
>     Here we have a problem:
>     If we create an object of an entity Customers : cust =
>     Customers(name='GazMyas',city='Chelyabinsk') , it wont be recorded
>     to a DB exactly at this moment and we wont able to use its ID (pk
>     of the record) to bind Licence records to it. In other words there
>     is no 'cust.id <http://cust.id>' element at this moment.
>     We can do a 'commit()' each time we create a Customer object.
>     After that 'cust.id <http://cust.id>' comes ready. But in case of
>     monstrous imports with over 20 000 records committing every record
>     to hdd slows down the import process to hours. And hangs up your
>     server hard drive. Anyway, it's a bad practice to commit every
>     record walking the huge array of incoming data.
>     So, by now, I fill up two dicts with Customers records,
>     incrementing their ID's manually (customer_id += 1) and Licences
>     records bound to this pre-calculated ID's. When dicts are ready, I
>     write them to a new DB walking through them.
>     Is there a better way to complete a data import without filling up
>     transition dicts and calculating autoincrement IDs by hand ? Can I
>     somehow use PKs of the records before committing them to DB ?
>     _______________________________________________
>     ponyorm-list mailing list
>     ponyorm-list at ponyorm.com <mailto:ponyorm-list at ponyorm.com>
>     /ponyorm-list
> -- 
> Regards,
> Matthew Bell
> _______________________________________________
> ponyorm-list mailing list
> ponyorm-list at ponyorm.com
> /ponyorm-list

-------------- next part --------------
An HTML attachment was scrubbed...
URL: </ponyorm-list/attachments/20150327/8f0f1683/attachment.html>

More information about the ponyorm-list mailing list