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

使用psycopg2复制到具有数组INT列的表

  •  2
  • nanounanue  · 技术社区  · 7 年前

    我创建了一个具有如下结构的表:

    create table some_table (
            id serial,
            numbers int []
    );
    

    我想以一种高效的方式复制熊猫数据帧,所以我不想使用慢速复制 to_sql https://stackoverflow.com/a/41876462/754176 https://stackoverflow.com/a/29125940/754176

    import pandas as pd
    import psycopg2
    
    # Create the connection, and the cursor (ommited)
    
    # Function from the second link
    def lst2pgarr(alist):
        return '{' + ','.join(alist) + '}'
    
    
    df = pd.DataFrame({'numbers': [[1,2,3], [4,5,6], [7,8,9]]})
    
    df['numbers'] = df.numbers.apply(lambda x: lst2pgarr([str(y) for y in x]))
    
    import io
    f = io.StringIO()
    df.to_csv(f, index=False, header=False, sep="|")
    f.seek(0)
    
    cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
    
    cursor.close()
    

    因此,我将代码修改为

    import csv
    
    df = pd.DataFrame({'numbers': [[1,2,3], [4,5,6], [7,8,9]]})
    
    df['numbers'] = df.numbers.apply(lambda x: lst2pgarr([str(y) for y in x]))
    
    
    f = io.StringIO()
    df.to_csv(f, index=False, header=False, sep="|", quoting=csv.QUOTE_ALL, quotechar="'"))
    f.seek(0)
    
    cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
    
    cursor.close()
    

    ---------------------------------------------------------------------------
    DataError                                 Traceback (most recent call last)
    <ipython-input-40-3c58c4a64abc> in <module>
    ----> 1 cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
    
    DataError: malformed array literal: "'{1,2,3}'"
    DETAIL:  Array value must start with "{" or dimension information.
    CONTEXT:  COPY some_table, line 1, column numbers: "'{1,2,3}'"
    

    我该怎么办?

    另外,了解第一个代码为什么不抛出错误也很有趣。

    1 回复  |  直到 7 年前
        1
  •  4
  •   klin    7 年前

    这段代码不会抛出错误,但不会向表中写入任何内容。

    如果您提交事务,则代码运行良好:

    cursor.close()
    connection.commit()