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

Вадим Бажов vadim at ideco.ru
Fri Mar 27 15:31:24 UTC 2015


Hello Alexander.
Seems to work when i pass customer as an object, thank you.
But what if i have another child entity for Licences, for example Keys 
entity which has many to one relation to Licences.
And, during the same iteration, i need to add available keys to newly 
added Licence of a newly created Customer.

I have Customers -> Licences -> Keys data structure. That's a final 
approach, i swear ! ))
Keys has Required relation field to Licences, f.e. 'licence_id'.
Licences has Required field to Customers, f.e. 'customer_id'.

I can add a Licence object to a Customer, passing Customer object to 
add() method.
But what should i do if i need to add() a Key to an added Licence.
cust.add() returns None so i cant see the use if it in anyway.

Is there a way to get a last added item to an entity object ?

On 27.03.2015 14:53, Alexander Kozlovsky wrote:
> > cust.licenses.add(License(x=1, y=2))
>
> I think this should works good if the `customer` attribute of the 
> License class was defined as Optional. But since it is Required, the 
> License constructor will raise exception here. So it is necessary to 
> specify customer right at the moment of the license creation. But it 
> need to be specified as an object and not as id value.
>
>
> On Fri, Mar 27, 2015 at 3:33 PM, Matthew Bell 
> <matthewrobertbell at gmail.com <mailto:matthewrobertbell at gmail.com>> wrote:
>
>     The way you are creating licenses is different from how I
>     suggested it:
>
>     cust.licenses.add(License(x=1, y=2))
>
>     You add an instance of License to the cust.licenses set.
>
>     That should work.
>
>     On 27 March 2015 at 11:32, Вадим Бажов <vadim at ideco.ru
>     <mailto:vadim at ideco.ru>> wrote:
>
>         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
>         <mailto:asd at qwe.com>') <- it doesn't create id before
>         commiting it.
>
>         lic = cust.licences.add(
>             customer=cust.id <http://cust.id>, <- required filed in DB
>         model. related to Customers record by PK.
>             x=1,
>             y=2
>         )
>
>         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  <mailto:ponyorm-list at ponyorm.com>
>>         /ponyorm-list
>
>
>         _______________________________________________
>         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 <mailto:ponyorm-list at ponyorm.com>
>     /ponyorm-list
>
>
>
>
> _______________________________________________
> ponyorm-list mailing list
> ponyorm-list at ponyorm.com
> /ponyorm-list

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


More information about the ponyorm-list mailing list