[PonyORM-list] get PK of the record before committing it to DB
matthewrobertbell at gmail.com
Fri Mar 27 12:33:27 UTC 2015
The way you are creating licenses is different from how I suggested it:
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
> 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> 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
>> 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
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the ponyorm-list