使用psycopg2批量插入,返回和更新

时间:2016-02-14 20:15:13

标签: python postgresql psycopg2

我正在使用postgres来记录订单。我有一个函数为每个订单插入一行,另一个函数在订单完成并确认后更新订单。截至目前,我正在使用'INSERT'来插入订单,RETURN使用row_id。然后,我使用UPDATEINSERT中返回的row_id来更新订单。我怎么能批量做到这一点?我看到psycopg2有executemany函数,但根据文档,它不能返回任何内容。有没有办法做到这一点?

def initial_log(self, orders):
    with self.conn.cursor() as cur:
        row_ids = []
        for order in orders:
            cur.execute('INSERT INTO orders (order_num, order_amount)
                         VALUES (%s, %s) RETURNING order_id;' 
                         (order.num, order.amount))
            row_id = cur.fetchone()[0]
            row_ids.append(row_id)
        self.conn.commit()
        return row_ids


def update_log(self, row_ids, updated_orders):
    with self.conn.cursor() as cur:
        for row_id, order in zip(row_ids, updated_orders):
            status_list = order.messages
            encoded_status = encode_status(status_list)
            cur.execute('UPDATE orders SET (final_order_amount, order_ack,
                    order_time, status) = 
                    (%s, %s, current_timestamp, %s) WHERE order_id = %s',
                    (order.final_amount,
                     order.ack_num, encoded_status, row_id))
        self.conn.commit()

1 个答案:

答案 0 :(得分:1)

def initial_log(self, orders):

    insert = '''
        insert into orders (order_num, order_amount)
        values {}
        returning order_id;
    '''.format(','.join(['%s'] * len(orders)))

    t = [(order.num, order.amount) for order in orders]

    cur = self.conn.cursor()
    # print cur.mogrify(insert, t)
    cur.execute(insert, t)
    rs = cur.fetchall()
    self.conn.commit()

    row_ids = [row[0] for row in rs]
    return row_ids

def update_log(self, row_ids, updated_orders):

    update = '''
        update orders o
        set (final_order_amount, order_ack, order_time, status) =
            (s.final_order_amount, s.order_ack, current_timestamp, s.status)
        from (values
            {}
        ) s (final_order_amount, order_ack, status, order_id)
        where o.order_id = s.order_id
    '''.format(','.join(['%s'] * len(updated_orders)))

    t = [
        (order.final_amount, order.ack_num, encode_status(order.messages), row_id)
        for row_id, order in zip(row_ids, updated_orders)
    ]

    cur = self.conn.cursor()
    # print cur.mogrify(update, t)
    cur.execute(update, t)
    self.conn.commit()

在检查发送到服务器的内容时​​取消注释cursor.mogrify