检查哪些ID已过账

check which ids exists postgrestable(检查哪些ID已过账)
本文介绍了检查哪些ID已过账的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

检查PostgreSQL表中存在哪些ID的速度如何

我写了以下函数,但当len(x)大于500 000时,它会非常慢

import psycopg2
conn = psycopg2.connect(...)
cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

def check_exist(lst):
    exist = []
    not_exist = []
    for i in lst:
        cursor.execute(f"SELECT * FROM table1 where id={i}")
        row = cursor.fetchone()
        if row:
            exist.append(i)
        else:
            not_exist.append(i)
    return exist, not_exist

x, y = check_exist(['2','4','3000','50000','10000000'])

推荐答案

您可以使用ANY,让postgres完成大部分工作:

import psycopg2, time
# database is in a datacenter just using a tunnel!
conn = psycopg2.connect("dbname=mf port=5959 host=localhost user=mf_usr")
cur = conn.cursor()

ids = [x for x in range(0, 750000)]

sql = """
    SELECT array_agg(id) from __users where id = ANY(%s);
"""
# array_agg: Postgres returns an array of ids!

_start = time.time()
cur.execute(sql, (ids, ))
existingIds = cur.fetchone()[0]
missingIds = set(ids) - set(existingIds)

print(len(existingIds))
print(len(missingIds))
print('Took: %.6f seconds' % (time.time() - _start))

输出:

284365
465635
Took: 5.564851 seconds

注意:确保ID列上有索引

这篇关于检查哪些ID已过账的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)