从表

时间:2016-05-30 14:17:08

标签: python python-2.7 sorting psycopg2

我正在开发一个新版本的模块,我需要为此创建一个新表,但我面临一个让我疯狂的小问题。

这是我的相关python代码:

import psycopg2, sys, psycopg2.extras, time

order = 4419

try:
    con = psycopg2.connect(host='localhost', database='DB01', user='odoo', password='******')
cur = con.cursor()
po_lines = 'SELECT pos_order_line.id FROM public.pos_order_line, public.product_template ' \
           'WHERE pos_order_line.product_id = product_template.id AND  pos_order_line.order_id = %s '\
           'AND (product_template.pos_categ_id != 5 AND product_template.pos_categ_id != 6)' \
           'ORDER BY pos_order_line.id ASC'
po_lines2 = 'SELECT pos_order_line.id, pos_order_line.order_id, product_template.name, pos_order_line.qty, product_template.pos_categ_id ' \
            'FROM public.pos_order_line, public.product_template  ' \
            'WHERE pos_order_line.product_id = product_template.id AND  pos_order_line.id = %s ' \
            'ORDER BY pos_order_line.id ASC'

cur.execute(po_lines,[order]); fetch_lines = cur.fetchall()
dish = ''; instr = []; kot = 0; dp = 0
print fetch_lines
for line in fetch_lines:
    cur.execute(po_lines2, [line]); pos_lines = cur.fetchone()
    if pos_lines[2].startswith('#'):
        instr.insert(1, pos_lines[2][2:]); kot = 1
    elif pos_lines[2].startswith('----'):
        dp = 1
    else:
        dish = pos_lines[2]
        kot = 0; instr = []
        if dp == 1:
            instr.insert(0, '!SERVIR DEPOIS!'); dp = 0
    if dish != pos_lines[2]:
        print 'Ordem: ', order, ' - Prato:', dish, ' - Instr:', instr, 'qt: ', pos_lines[3],'kot: ', kot, 'dp status:', dp

except psycopg2.DatabaseError, e:
print 'Error %s' % e
sys.exit(1)

finally:
    if con:
        con.close()

从我的查询开始:

ID     ORDER PRODUCT                    QTY     CAT
12811  4419  "Crudo GR"                 1.0       1
12812  4419  "Salame e Grana GR"        1.0       1
12813  4419  "---- servir depois ----"  1.0       7
12814  4419  "Nutella Ban GR"           1.0       3
12815  4419  "# Cortar em dois"         1.0       7

恢复所有产品系列(pos_lines [2])不以'#'开头或者与' ----'需要放在一个变量' instr'直到var'菜#39;变化。 所有行都被正确读取,因为如果我在所有IF周期结束时放置一个print语句,我可以看到变量是如何填充的:

  

1 Ordem:4419 - Prato:Crudo GR - Instr:[] qt:1.0 kot:0 dp status:0

     

2 Ordem:4419 - Prato:Salame e Grana GR - Instr:[] qt:1.0 kot:0 dp status:0

     

3 Ordem:4419 - Prato:Salame e Grana GR - Instr:[] qt:1.0 kot:0 dp status:1

     

4 Ordem:4419 - Prato:Nutella Ban GR - Instr:['!SERVIR DEPOIS!'] qt:1.0 kot:0 dp status:0

     

5 Ordem:4419 - Prato:Nutella Ban GR - Instr:['!SERVIR DEPOIS!',' Cortar em dois'] qt:1.0 kot:0 dp status: 0

我计算了这些线只是为了表明问题是什么:第2和第4行应该被隐藏,因为它们只是中间步骤。 然后我需要的结果应该是:

ID     ORDER PRODUCT              INSTR                              QTY     
12811  4419  "Crudo GR"                                               1.0       
12812  4419  "Salame e Grana GR"                                    1.0       
12814  4419  "Nutella Ban GR"     "!SERVIR DEPOIS! Cortar em dois"          1.0       

有人可以轻轻地告诉我代码中的错误在哪里以及如何输出正确的打印声明? 请注意我在Python上比较新,怜悯。

感谢。

编辑:根据Merlin的提示,采用更简单的方法解决。

由于我有很多变种,Merlin编写的代码很难为我设置。我以更基本的方式重写了部分脚本。 在这个版本中,我已经恢复了获取的行以获取并在临时表中将产品后面的所有指令(#)添加到相应行。然后我再次反转线条以检查是否有一条线路' ----'在一个产品和添加到相应的产品之前,我写到决赛桌。这个脚本很容易阅读(对于像我这样的新手)并避免使用'运算符'模块简单地用[:: - 1]反转一个表。

TableTemp = []; newTable = []; Instr = ''

for line in fetch_lines[::-1]:
    if line[2].startswith('#') or line[2].startswith('----'):
        if line[2].startswith('#'):
            Instr = line[2][2:]+' | '+ Instr
        if line[2].startswith('----'):
            TableTemp.append((line[0], line[1], line[2], '', line[3], line[4]))
    else:
        TableTemp.append((line[0],line[1],line[2], Instr, line[3], line[4]))
        Instr = ''

for line in TableTemp[::-1]:
    if line[2].startswith('----'):
        Instr = '!SERVIR DEPOIS! | '
    else:
        newTable.append((line[0],line[1],line[2], Instr+line[3][:-3], line[4], line[5]))
        Instr = ''

结果:

内部提取:

(13264, 4558, 'Funghi GR', Decimal('1.0'), 'Mesa 11')
(13265, 4558, '# + Champinhons', Decimal('1.0'), 'Mesa 11')
(13266, 4558, '# + Alface', Decimal('1.0'), 'Mesa 11')
(13267, 4558, '# - R\xc3\xbacola', Decimal('1.0'), 'Mesa 11')
(13268, 4558, 'Formaggi GR', Decimal('1.0'), 'Mesa 11')
(13269, 4558, '# Cortar em dois', Decimal('1.0'), 'Mesa 11')
(13270, 4558, '---- servir depois ----', Decimal('1.0'), 'Mesa 11')
(13271, 4558, 'Nutella GR', Decimal('1.0'), 'Mesa 11')
(13272, 4558, '# Cortar em dois', Decimal('1.0'), 'Mesa 11')
(13273, 4558, '---- servir depois ----', Decimal('1.0'), 'Mesa 11')
(13274, 4558, 'Nutella Mor MD', Decimal('1.0'), 'Mesa 11')
(13275, 4558, '# Para Levar', Decimal('1.0'), 'Mesa 11')

输出表:

(13264, 4558, 'Funghi GR', '+ Champinhons | + Alface | - R\xc3\xbacola', Decimal('1.0'), 'Mesa 11')
(13268, 4558, 'Formaggi GR', 'Cortar em dois', Decimal('1.0'), 'Mesa 11')
(13271, 4558, 'Nutella GR', '!SERVIR DEPOIS! | Cortar em dois', Decimal('1.0'), 'Mesa 11')
(13274, 4558, 'Nutella Mor MD', '!SERVIR DEPOIS! | Para Levar', Decimal('1.0'), 'Mesa 11')

2 个答案:

答案 0 :(得分:1)

它似乎有两张桌子。这样你只需要两次访问数据库就可以了。

进行提取 - 从表中获取数据

表一

ID     ORDER PRODUCT                    QTY     CAT
12811  4419  "Crudo GR"                 1.0       1
12812  4419  "Salame e Grana GR"        1.0       1
12813  4419  "---- servir depois ----"  1.0       7
12814  4419  "Nutella Ban GR"           1.0       3
12815  4419  "# Cortar em dois"         1.0       7

以表格形式获取数据,

newTable = [] 
Intr = ''

    #Added something like
    #http://www.saltycrane.com/blog/2007/12/how-to-sort-table-by-columns-in-python/
        #import operator
       #fetch_lines = sorted(fetch_lines, key=operator.itemgetter(col))

#Sort table so looks like this

    # ID     ORDER PRODUCT                    QTY     CAT
   # 12815  4419  "# Cortar em dois"         1.0       7
   # 12813  4419  "---- servir depois ----"  1.0       7
   # 12811  4419  "Crudo GR"                 1.0       1
   # 12812  4419  "Salame e Grana GR"        1.0       1
   # 12814  4419  "Nutella Ban GR"           1.0       3


for i,line in enumerate(fetch_lines):
    if line[2].startswith('#') or line[2].startswith('----'): 
        # Within this if statement you can make adjustment to text item
        if line[2].startswith('#')
           Intr =  Intr + " Cortar em dois"
        if line[2].startswith('----')
           Intr =  '!SERVIR DEPOIS!' + Intr
    if i == len(fetch_lines) -1:
        newTable.append([line[0], ....., Intr ,  ...])
    if i < len(fetch_lines)
        newTable.append([line[0], ....., '',  ...])
print table


   #Then sort by first column  so table look right 
           #table = sorted( newTable, key=operator.itemgetter(col))

#ID     ORDER PRODUCT              INSTR                              QTY     
#12811  4419  "Crudo GR"                                               1.0       
#12812  4419  "Salame e Grana GR"                                    1.0       
#12814  4419  "Nutella Ban GR"     "!SERVIR DEPOIS! Cortar em dois"          1.0   

尝试将Intr放在最后一行:

newTable = [] 
Intr     = ''
LineCt   = 0


for line in fetch_lines:
    if line[2].startswith('#') or line[2].startswith('----'): 
        # Within this if statement you can make adjustment to text item
        if line[2].startswith('#'):
           Intr =  Intr + " Cortar em dois"
           LineCt +=1
        if line[2].startswith('----'):
           Intr =  '!SERVIR DEPOIS!' + Intr
           LineCt +=1   

for i,line in enumerate(fetch_lines):
    if line[2].startswith('#') or line[2].startswith('----'): pass        
    elif i == len(fetch_lines) - LineCt:
        newTable.append([line[0],line[1], line[2], Intr , "" ])
        Intr     = ''
    elif i < len(fetch_lines):
        newTable.append([line[0],line[1],line[2], '', "" ])        

print Intr        
for e in newTable: print e

输出:

  [12811, 4419, 'Crudo GR', '', '']
    [12812, 4419, 'Salame e Grana GR', '', '']
    [12814, 4419, 'Nutella Ban GR', '!SERVIR DEPOIS! Cortar em dois', ''

答案 1 :(得分:0)

临时解决了@Merlin的巨大帮助,他开车送我到正确的方向,但我需要安排代码。最重要的技巧是从表中选择DESC中的行。

po_lines = '''SELECT pos_order_line.id, pos_order_line.order_id, product_template.name, pos_order_line.qty, product_template.pos_categ_id
           FROM public.pos_order_line, public.product_template
           WHERE pos_order_line.product_id = product_template.id AND  pos_order_line.order_id = %s
           AND (product_template.pos_categ_id != 5 AND product_template.pos_categ_id != 6)
           ORDER BY pos_order_line.id DESC'''

cur.execute(po_lines,[order]); fetch_lines = cur.fetchall()
instr = ''; newTable = []

for i, line in enumerate(fetch_lines):
    if line[2].startswith('#') or line[2].startswith('----'):
        if line[2].startswith('#'):
            instr = instr + line[2][2:]
        if line[2].startswith('----'):
            line_in = fetch_lines[i-1]
            extract_line = tuple([item[3] for item in newTable if line_in[0] in item])
            newTable = [t for t in newTable if t[0] != line_in[0]]
            instr = '!SERVIR DEPOIS!/' + extract_line[0]
            newTable.append((line_in[0], line_in[1], line_in[2], instr))
            instr = ''
    else:
        newTable.append((line[0], line[1], line[2], instr))
        instr = ''

for i,l in enumerate(newTable[::-1]):
    print i,l

结果:

0 (12811, 4419, 'Crudo GR', '')
1 (12812, 4419, 'Salame e Grana GR', '')
2 (12814, 4419, 'Nutella Ban GR', '!SERVIR DEPOIS!/Cortar em dois')

我确信我的代码可能会更好,但在旧版本中,我需要超过80行代码来存档。这对我的Python知识来说是一个巨大的进步。