使用Pandas Python将选择性的列插入Postgres

时间:2018-09-14 07:25:55

标签: python postgresql pandas

目标是将excel列数据写入postgres表中,但是excel中的所有列名称均与表列不匹配。 因此,我正在尝试仅插入公共列。 我可以获取集中的通用数据。

我对如何在单个查询中插入数据感到困惑。

我正在使用熊猫数据框。

 #Getting table columns in a list
    conn = psycopg2.connect(dbname=dbname, host=host, port=port, user=user, password=pwd)
    print("Connecting to Database")
    cur = conn.cursor()
    cur.execute("SELECT * FROM " + table_name + " LIMIT 0")
    table_columns = [desc[0] for desc in cur.description]
    #print table_columns

    #Getting excel sheet columns in a list
    df = pd.read_excel('/Users/.../plans.xlsx', sheet_name='plans')
    engine = create_engine('postgresql://postgres:postgres@localhost:5432/test_db')
    column_list = df.columns.values.tolist()
    #print(column_list)
    s = set(column_list).intersection(set(table_columns))
    for x in df['column_1'] :
        sql = "insert into test_table(column_1) values ('" + x + "')"
        cur.execute(sql)
        cur.execute("commit;")

    conn.close()

根据答案更新代码,但是每次我运行程序时,它都会插入新记录。有什么我可以做的选择吗?

 s = set(column_list).intersection(set(table_columns))

    df1 = df[df.columns.intersection(table_columns)]

    #print df1
    df1.to_sql('medical_plans', con=engine, if_exists='append', index=False, index_label=None)

1 个答案:

答案 0 :(得分:0)

您可以将集合中的所有值连接成一个字符串,并将其传递给查询:

df = {'column_1':[1,2,3,4,5,6,7]}
all_vals = ','.join(map(str,df['column_1']))

然后可以使用以下内容创建查询字符串:

sql = "insert into test_table(column_1) values ('{vals}')".format(vals=all_vals)