Python将数据保存到PostgreSQL : array value error

标签 python pandas postgresql azure

我正在尝试学习如何将 pandas 创建的数据帧保存到 postgresql 数据库(托管在 Azure 上)。我计划从简单的虚拟数据开始:

data = {'a':  ['x', 'y'],
        'b': ['z', 'p'],
        'c': [3, 5]
        }

df = pd.DataFrame (data, columns = ['a','b','c'])

我发现了一个将 df 数据推送到 psql 表中的函数。它从定义连接开始:

def connect(params_dic):
    """ Connect to the PostgreSQL database server """
    conn = None
    try:
        # connect to the PostgreSQL server
        print('Connecting to the PostgreSQL database...')
        conn = psycopg2.connect(**params_dic)
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
        sys.exit(1) 
    print("Connection successful")
    return conn
conn = connect(param_dic)

*param_dic 包含所有连接详细信息(用户/密码/主机/数据库) 建立连接后,我将定义执行函数:

def execute_many(conn, df, table):
    """
    Using cursor.executemany() to insert the dataframe
    """
    # Create a list of tupples from the dataframe values
    tuples = [tuple(x) for x in df.to_numpy()]
    # Comma-separated dataframe columns
    cols = ','.join(list(df.columns))
    # SQL quert to execute
    query  = "INSERT INTO %s(%s) VALUES(%%s,%%s,%%s)" % (table, cols)
    cursor = conn.cursor()
    try:
        cursor.executemany(query, tuples)
        conn.commit()
    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        conn.rollback()
        cursor.close()
        return 1
    print("execute_many() done")
    cursor.close()

我对在数据库中创建的 psql 表执行了此函数:

execute_many(conn,df,"raw_data.test")

表 raw_data.test 由列 a(char[])、b(char[])、c(numeric) 组成。 当我运行代码时,我在控制台中收到以下信息:

Connecting to the PostgreSQL database...
Connection successful
Error: malformed array literal: "x"
LINE 1: INSERT INTO raw_data.test(a,b,c) VALUES('x','z',3)
                                                ^
DETAIL:  Array value must start with "{" or dimension information.

我不知道如何解释它,因为 df 中的列都不是数组

df.dtypes
Out[185]: 
a    object
b    object
c     int64
dtype: object

有什么想法出了什么问题或者建议如何以更简单的方式将 df 保存在 pSQL 中吗?我发现很多使用 sqlalchemy 并通过以下方式创建连接字符串的解决方案:

conn_string = 'postgres://user:password@host/database'

但我不确定这是否适用于云数据库 - 如果我尝试使用 azure 主机详细信息编辑此类连接字符串,则它不起作用。

最佳答案

PostgreSQL 中字符串的常用数据类型是 TEXTVARCHAR(n)CHAR(n),带圆括号;不是带方括号的 CHAR[]

  • 我猜您希望该列包含一个字符串,而 CHAR[] 是一个拼写错误;在这种情况下,您需要重新创建(或迁移)表列到正确的类型 - 最有可能是 TEXT

    (如果它确实是固定长度的,您可以将 CHAR(n) 用于固定长度数据;VARCHAR(n) 主要具有历史意义。在大多数情况下情况下,请使用TEXT。)

  • 或者,如果您确实打算将该列设为数组,则需要从 Python 传递该位置的列表。

关于Python将数据保存到PostgreSQL : array value error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68243843/

相关文章:

python - 使 Python 脚本与 linux 包相结合,易于最终用户安装

python - 在 Python Pandas DataFrame 中删除重复项而不删除重复项

sql - 计算特定名称的行

node.js - Sequelize 选择并包含另一个表别名

sql - 如何选择除原始行之外的所有重复行?

python - 如何捕获默认错误?

python - 如何从列表中停止 EC2 实例

python - 来自 sklearn 的 BayesianGaussianMixture 的非常大的对数概率

python - Pandas:for 循环遍历列

python - 动态 reshape Pandas 中的数据框