从python批量插入postgres表

GetInTwo

我想将熊猫数据框中的值插入/更新到postgres表中。我在postgres表中有一个唯一的元组(a,b)。如果元组已经存在,我只想更新第三个值c,如果元组不存在,我想创建一个三元组(a,b,c)。

这样做最有效的方法是什么?我猜是某种形式的批量插入,但是我不确定如何精确插入。

鲍里斯通切夫

您可以将数据框转换为CTE https://www.postgresql.org/docs/current/queries-with.html,然后将CTE中的数据插入表中。像这样:

def convert_df_to_cte(df):
    vals = ', \n'.join([f"{tuple([f'$str${e}$str$' for e in row])}" for row in df.values])
    vals = vals.replace("'$str$", "$str$")
    vals = vals.replace("$str$'", "$str$")
    vals = vals.replace('"$str$', "$str$")
    vals = vals.replace('$str$"', "$str$")
    vals = vals.replace('$str$nan$str$', 'NULL')

    columns = ', \n'.join(df.columns)

    sql = f"""
    WITH vals AS (
        SELECT 
            {columns}
        FROM 
            (VALUES {vals}) AS t ({columns})
    )
    """
    return sql


df = pd.DataFrame([[1, 2, 3]], columns=['col_1', 'col_2', 'col_3'])

cte_sql = convert_df_to_cte(df)
sql_to_insert = f"""
{cte_sql}

INSERT INTO schema.table (col_1, col_2, col_3)
SELECT 
    col_1::integer, -- don't forget to cast to right type to avoid errors
    col_2::integer, -- don't forget to cast to right type to avoid errors
    col_3::character varying
FROM 
    vals
ON CONFLICT (col_1, col_2) DO UPDATE SET
    col_3 = excluded.col_3;
"""

run_sql(sql)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL批量插入多个表

来自分类Dev

Rails批量插入多个表

来自分类Dev

XML批量插入Oracle表

来自分类Dev

用Python批量插入MySQL

来自分类Dev

pymssql批量插入错误(python)

来自分类Dev

SQLite批量插入到多个表

来自分类Dev

批量插入期间的SQL Server表锁定

来自分类Dev

使用brianc / node-postgres批量插入Postgres

来自分类Dev

使用brianc / node-postgres批量插入Postgres

来自分类Dev

批量插入,如果在Postgres上发生冲突(批量插入),则进行更新

来自分类Dev

插入postgres之前截断表

来自分类Dev

插入postgres之前截断表

来自分类Dev

Azure持久功能,可向Postgres DB批量插入

来自分类Dev

使用Python脚本进行Mozenda批量插入

来自分类Dev

通过python批量插入沙发床

来自分类Dev

python:sqlalchemy批量插入与on_conflict_update

来自分类Dev

批量插入

来自分类Dev

使用批量插入在oracle中的表之间移动大数据

来自分类Dev

使用Anorm批量插入具有很多列的表

来自分类Dev

从文本文件批量插入到临时表中

来自分类Dev

具有目标表标识列的批量插入

来自分类Dev

MySQL-从选择查询的结果批量插入表

来自分类Dev

使用文本文件批量插入创建表

来自分类Dev

使用ODBC连接从DataTable批量插入SQL Server表

来自分类Dev

通过检查条件将批量数据插入表中

来自分类Dev

在oracle中批量插入时,表名称无效

来自分类Dev

PostgreSQLCopyHelper 批量插入 Postgresql 表 C# 固定宽度文件

来自分类Dev

SSIS“由于目标表的架构更改,批量插入失败

来自分类Dev

使用 pyodbc 批量插入 SQL Server 表:找不到文件