跳至内容
菜单
此问题已终结
1 回复
6786 查看

Hi, in my application that I'm trying to port in Openerp, I use a sql insert on a table like this:
INSERT INTO target_table (list of fields) SELECT field_list and other values FROM source_table WHERE complex_conditions_with_subselect_from_different_table ORDER BY x,y,z

How to obtain the same behavoiur in Openerp? I guess I should try to use the orm, instead of pure SQL.
I have three different models: the one in which I will operate, let's call it shpmnt, the source, let's call it cust, and the target, let's call it shpmnt_log (actually I have one more model for the subquery, but we can ignore it by now).
I guess I should do something like this (without going into details):
"""Define the cursors"""
source_cr = self.pool.get('cust.cust')
target_cr = self.pool.get('shpmnt.log')
"""Find the needed elements"""
src_ids = source_cr.search(cr,user,search_domain)

""" Browse the result, iterate through elements and create the record to save"""

my_objs = source_cr.browse(cr,uid, src_ids)

for cur_obj in my_objs:
"""Create val to insert using filed from cur_obj and other values"""
    my_vals = ...
"""Insert into the target table"""
    target_cr.create(cr,uid,my_vals)

Now my questions are:
1) Am I correct? Is this approach right?
2) Doing this way, since the selection is huge, I will make a lot of writes: is there a more effective method?  Mybe using export_data and then load? Something like:

my_data = source_cr.export_data(cr, uid, src_ids, list_of_fileds) 

target_cr.load(cr, uid, list_of_fields, my_data)

Will it work? Is it more efficent or is it the same?

Since the whole process should be inside a single transaction, how can I do? Is it possible?
Shall I put the code inside one method?
If so, doing it on something like 20.000 rows, are there chances to get out of memory?

Thanks

 

    
    

形象
丢弃
编写者

A lot of views, but no answer yet!?!

编写者

Thank you René, can you tell me if the process will be inside a single transaction, so that it succeeds or fails as a whole?

最佳答案

1) Your approach will work.

2) Your suggested export_data and load methods are more or less read and create. The ORM might be smart and the performance is quite the same as in a direct SQL insert.

I can not state whether the memory will lack.

Some remark:

The ORM provides a search_read method, that might improve your overall performance.

形象
丢弃
相关帖文 回复 查看 活动
1
1月 19
4392
4
10月 15
19068
0
12月 16
4114
0
5月 15
4148
2
8月 23
1887