将 Numpy 数组的 float64 项作为二进制插入 PostgreSQL

我正在尝试将 Numpy 数组插入 PostgreSQL。试图这样做


def write_to_db(some_arr, some_txt):

""" insert a new array into the face_ar table """

    sql = """INSERT INTO test_db VALUES(%s,%s);"""

    conn = None

    try:

        params = config()

        conn = psycopg2.connect(**params)

        cur = conn.cursor()

        cur.execute(sql, (some_arr, some_txt))

        conn.commit()

        cur.close()


    except (Exception, psycopg2.DatabaseError) as e:

        print(e)

    finally:

        if conn is not None:

            conn.close()

在它之前我在我的数据库中创建了一个表


create table test_db (encodings double precision[], link text);

最后我得到一个错误:“不能适应类型 'numpy.ndarray'”


我需要编写包含 125 个 float64 项的 Numpy 数组和每行中的链接等小文本。我的项目中会有几百万行。只是读取速度和数据库大小很重要。据我所知,无法直接插入 Numpy 数组,需要将其转换为另一种格式。我得到的第一个想法是将其转换为二进制数据并将其保存到 DB,但我不知道该怎么做以及如何以 Numpy 数组格式从 DB 取回它。


三国纷争
浏览 210回答 2
2回答

qq_遁去的一_1

这种方法在读取数据方面开始运行良好且快速import psycopg2from config import configimport msgpackimport msgpack_numpy as mdef write_to_db(encoding, link):""" insert a new array into the test1_db table """    sql = """INSERT INTO test1_db VALUES(%s,%s);"""    conn = None    dumped_data = msgpack.packb(encoding, default=m.encode)    try:        params = config()        conn = psycopg2.connect(**params)        cur = conn.cursor()        cur.execute(sql, (dumped_data, link))        conn.commit()        cur.close()    except (Exception, psycopg2.DatabaseError) as e:        print(e)    finally:        if conn is not None:            conn.close()def read_from_db():""" query data from the test1_db table """    conn = None    row = None    try:        params = config()        conn = psycopg2.connect(**params)        cur = conn.cursor()        cur.execute("SELECT encodings, link FROM test1_db")        print("The number of rows: ", cur.rowcount)        row = cur.fetchone()        cur.close()    except (Exception, psycopg2.DatabaseError) as error:        print(error)    finally:        if conn is not None:            conn.close()        encoding1, somelink = row        return msgpack.unpackb(encoding1, object_hook=m.decode), somelink

德玛西亚99

尝试使用pickle python进行二进制序列化/反序列化例子:import numpy as npfrom pickle import dumps, loadsdata=np.array([1,2,4,5,6])dumped_data = dumps(data)loaded_data = loads(dumped_data)print(dumped_data)print(loaded_data)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python