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

Вадим Бажов vadim at ideco.ru
Fri Mar 27 16:46:47 UTC 2015


It was simple !
Just rewrote the whole import procedure in the first mentioned way. 
Works as expected.
Thank you Alexander and have a nice weekend !

On 27.03.2015 17:53, Alexander Kozlovsky wrote:
> You can just write:
>
>     cust = Customer(name='asd',email='asd at qwe.com <mailto:asd at qwe.com>')
>     lic = License(customer=cust, x=1, y=2)
>     key1 = Key(license=lic, a=1, b=2)
>     key2 = Key(license=lic, a=3, b=4)
>
> or, equivalently:
>
>     cust = Customer(name='asd',email='asd at qwe.com <mailto:asd at qwe.com>')
>     lic = cust.licenses.create(x=1, y=2)
>     key1 = lic.keys.create(a=1, b=2)
>     key2 = lic.keys.create(a=3, b=4)
>
> The add() method of collection did not return anything, but the 
> create() method returns newly created object.
>
>
>
> On Fri, Mar 27, 2015 at 6:31 PM, Вадим Бажов <vadim at ideco.ru
> <mailto:vadim at ideco.ru>> wrote:
>
>     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  <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
>
>
>
>
> _______________________________________________
> ponyorm-list mailing list
> ponyorm-list at ponyorm.com
> /ponyorm-list

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


More information about the ponyorm-list mailing list