[PonyORM-list] get PK of the record before committing it to DB
Alexander Kozlovsky
alexander.kozlovsky at gmail.com
Fri Mar 27 12:53:21 UTC 2015
> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </ponyorm-list/attachments/20150327/40dd1aca/attachment.html>
More information about the ponyorm-list
mailing list