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

Alexander Kozlovsky alexander.kozlovsky at gmail.com
Fri Mar 27 15:53:41 UTC 2015


You can just write:

    cust = Customer(name='asd',email='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')
    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> 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
> > 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> 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') <- 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.
>>>     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> 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' element at this moment.
>>>>
>>>> We can do a 'commit()' each time we create a Customer object. After
>>>> that '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
>>>> /ponyorm-list
>>>>
>>>>
>>>
>>>
>>> --
>>> Regards,
>>>
>>> Matthew Bell
>>>
>>>
>>> _______________________________________________
>>> ponyorm-list mailing listponyorm-list at ponyorm.comhttps://mailman-mail5.webfaction.com/listinfo/ponyorm-list
>>>
>>>
>>>
>>> _______________________________________________
>>> ponyorm-list mailing list
>>> ponyorm-list at ponyorm.com
>>> /ponyorm-list
>>>
>>>
>>
>>
>> --
>> Regards,
>>
>> Matthew Bell
>>
>> _______________________________________________
>> ponyorm-list mailing list
>> ponyorm-list at ponyorm.com
>> /ponyorm-list
>>
>>
>
>
> _______________________________________________
> ponyorm-list mailing listponyorm-list at ponyorm.comhttps://mailman-mail5.webfaction.com/listinfo/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/713e5cda/attachment.html>


More information about the ponyorm-list mailing list