代码之家  ›  专栏  ›  技术社区  ›  TobiasDK

将python numpy数组插入PostgreSQL数据库

  •  1
  • TobiasDK  · 技术社区  · 6 年前

    如何将大量坐标(x,y)插入Postgressql表中?我不想用 for 循环。它是一个3601x3601像素的光栅。

    import numpy as np
    import psycopg2
    
    
    # Data example:
    east = np.linspace(-180.0,180.0,num=10)
    north = np.linspace(-90.0,90.0,num=10)
    coor = np.vstack([east, north])
    
    conn = psycopg2.connect("dbname='postgres' user='dbuser' host='localhost' password='dbpass'")
    cur = conn.cursor()
    cur.execute("DROP TABLE IF EXISTS foobar;")
    cur.execute("CREATE TABLE foobar (coordinate   point);")
    
    # Working for an coordinate example:
    cur.execute("INSERT INTO foobar VALUES (('12.56,56.43'));")
    
    # Working for 1st coordinate in coor:
    tmp = ','.join(str(e) for e in coor[:,0])
    cur.execute('INSERT INTO foobar VALUES (point(' + tmp + '));')
    
    # NOT WORKING!!!
    # Insert all points in one go:
    # cur.execute('INSERT INTO foobar VALUES (coor);')
    
    conn.commit()
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   klin    6 年前

    有了这个功能 execute_values() 可以使用单个SQL语句插入多行。您应该按照以下格式为函数准备数据:

    [['(-180.0, -90.0)'],
     ['(-140.0, -70.0)'],
     ['(-100.0, -50.0)'],
     ['(-60.0, -30.0)'],
     ['(-20.0, -10.0)'],
     ['(20.0, 10.0)'],
     ['(60.0, 30.0)'],
     ['(100.0, 50.0)'],
     ['(140.0, 70.0)'],
     ['(180.0, 90.0)']]
    

    代码:

    from psycopg2.extras import execute_values
    
    # Data example:
    east = np.linspace(-180.0,180.0,num=10)
    north = np.linspace(-90.0,90.0,num=10)
    
    # get array of pairs [east, north]
    coor = np.dstack([east, north])
    
    # convert to array of tuples (east, north) as strings
    values = [[str(tuple(i))] for i in coor[0]]
    
    execute_values(cur, 'INSERT INTO foobar VALUES %s', values)
    
    conn.commit()
    

    也见 this answer.

        2
  •  1
  •   mehdix    6 年前

    你可以使用 cur.executemany psycopg2.extras.execute_values 一次插入多个记录。这是你的样品适合使用 execute_values 以下内容:

    import psycopg2.extras
    values = map(lambda a: ['{},{}'.format(a[0],a[1])], np.column_stack((east, north)))
    psycopg2.extras.execute_values(cur, "INSERT INTO foobar (coordinate) VALUES %s", values)