我正在使用postgres来记录订单。我有一个函数为每个订单插入一行,另一个函数在订单完成并确认后更新订单。截至目前,我正在使用'INSERT'来插入订单,RETURN
使用row_id。然后,我使用UPDATE
和INSERT
中返回的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()
答案 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
。