python Postgresql批量更新对比单条更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python Postgresql批量更新对比单条更新相关的知识,希望对你有一定的参考价值。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: ficapy

import random
import csv
import time
from functools import wraps
from io import StringIO
from contextlib import closing, contextmanager
from psycopg2.pool import ThreadedConnectionPool
from psycopg2.extras import execute_values


pool = ThreadedConnectionPool(
    5,  ## Min
    20,  ## Max
    database='dbname',
    user='username',
    password='pwd')


@contextmanager
def get_curs():
    conn = pool.getconn()
    try:
        yield conn.cursor()
        conn.commit()
    except Exception:
        conn.rollback()
    finally:
        pool.putconn(conn)


def timeit(func):
    @wraps(func)
    def inner(*args, **kwargs):
        with closing(StringIO()) as f, get_curs() as curs:
            curs.execute("DROP TABLE IF EXISTS demo;")
            curs.execute("""CREATE TABLE IF NOT EXISTS demo (
                id INT PRIMARY KEY,
                mch_id INT
            )""")

            writer = csv.writer(f)
            for i in range(1, 1000000):
                writer.writerow(map(str, [i, random.randint(1, 1000)]))
            f.seek(0)

            curs.copy_from(f, 'demo', sep=',')

        print("start {}".format(func.__name__))
        start = time.time()
        func(*args, **kwargs)
        print("{} elapse times: {}".format(func.__name__, time.time() - start))

    return inner


@timeit
def single(data: dict):
    for key, value in data.items():
        with get_curs() as curs:
            curs.execute("UPDATE demo SET mch_id = %s WHERE id = %s", (value,key))


@timeit
def batch(data: dict):
    with get_curs() as curs:
        execute_values(curs,
                       "UPDATE demo SET mch_id=tmp.mch_id FROM (VALUES %s) AS tmp (id,mch_id) WHERE demo.id=tmp.id",
                       list(data.items()))


if __name__ == '__main__':
    data = {i: random.randint(1, 1000) for i in range(1, 1000000)}
    batch(data)
    single(data)

# Result
# start batch
# batch elapse times: 13.745781898498535
# start single
# single elapse times: 343.0373680591583

以上是关于python Postgresql批量更新对比单条更新的主要内容,如果未能解决你的问题,请参考以下文章

mysql 批量更新还是单条更新如何选择

mysql 批量更新还是单条更新如何选择

Spring Boot Elasticsearch7.6.2实现创建索引删除索引判断索引是否存在获取/添加/删除/更新索引别名单条/批量插入单条/批量更新删除数据递归统计ES聚合的数据

SQLAlchemy - 在 postgresql 中执行批量 upsert(如果存在,更新,否则插入)

在 postgreSql 上使用 ParameterizedPreparedStatementSetter 与 BatchPreparedStatementSetter 进行批量更新?

在 PostgreSQL 中使用关联数组进行批量更新