瞧!Python 如何将百万数据入PostgreSQL库

2022-07-05 14:32:34 浏览数 (1)

1. PostgreSQL 是什么

PostgreSQL 是一个功能强大的开源对象关系型数据库系统,他使用和扩展了SQL语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。

PostgreSQL 的起源可以追溯到1986年,作为加州大学伯克利分校POSTGRES项目的一部分,并且在核心平台上进行了30多年的积极开发。

PostgreSQL 凭借其经过验证的架构,可靠性,数据完整性,强大的功能集,可扩展性以及软件背后的开源社区的奉献精神赢得了良好的声誉,以始终如一地提供高性能和创新的解决方案。

2. 业务驱动选择 PostgreSQL

由于业务在做压测时需要灌入大量的测试数据,试过很多方式都没有很好解决,最终选择用 Python 来实现数据灌入到 PostgreSQL,粗估数据处理效率可达6.5W/s.

3. Python代码实现

代码里面有一个 batchs 的参数,用来控制批量插入数据库批次,目前给的1000,效果还是十分不错的。

代码如下:

代码语言:javascript复制
from openpyxl import load_workbook
import random
import psycopg2
batchs =1000

def data(datas):
    conn = None
    try:
        conn = psycopg2.connect(database="test_62554cf827ca24dc542c4258", user="postgres", password="123456",
                                host="10.10.11.248", port="5432")
        print("connected to postgres db successfully")
    except:
        print("I am unable to connect to the database")
    try:
        cursor = conn.cursor()
        sql = "insert into t_fact_6260d12dcd211247f807e521 values "   datas ";"
        print(sql)
        cursor.execute(sql)
    except (Exception, psycopg2.Error) as error:
        print("Error caught", error)
    finally:
        conn.commit()
        if (conn):
            cursor.close()
            conn.close()

def insertData():
    count = 0
    lw=load_workbook(r'D:wlbussiness_studytestdata.xlsx', read_only='read_only')
    ws = lw.active
    print(ws.rows)
    lst=[]
    strs = ""
    for row in ws.rows:
        count  = 1
        lst.append("111" str(random.random()))
        lst.append(0)
        lst.append("1634745600.0")
        lst.append("513567da-2d61-41db-a4cb-f2" str(random.randint(100000000,999999999)))
        for col in row:
            lst.append(col.value)
        print("执行第--%d--行" % (count))
        # print(lst)
        str2 = str(tuple(lst)).replace("None", "'None'") ","
        # print(str2)
        if(count�tchs==0):
            strs  = str2
            # print(strs)
            data(strs[:-1])
            lst = []
            strs = ""
            count=0
        else:
            strs  = str2
            # print(strs)
            lst=[]
        str2 = ""
        # print(strs)

if __name__ == '__main__':
    insertData()

0 人点赞