如何在SQLAlchemy中使用熊猫进行upsert

时间:2018-08-18 04:44:11

标签: python postgresql sqlalchemy psycopg2

我通过SqlAlchemy在PostgreSQL中创建了一个表:

my_table = Table('test_table', meta,
                         Column('id', Integer,primary_key=True,unique=True),
                         Column('value1', Integer),
                         Column('value2', Integer)
                         )

我想通过一个数据框来向上插入该表:

   id  value1  value2
0   1    32.0       1
1   2     2.0      32
2   3     NaN       3
3   4   213.0      23

我尝试通过on_conflict_do_update中的SqlAlchemy在我的代码中进行向上插入,如下所示:

insert_statement = sqlalchemy.dialects.postgresql.insert(my_table,).values(df.to_dict(orient='records'))
upsert_statement = insert_statement.on_conflict_do_update(
                                    index_elements=['id'],
                                    set_= df.to_dict(orient='dict')
                                )
conn.execute(upsert_statement)

但是显示此错误:

  

(psycopg2.ProgrammingError)无法适应类型'dict'

我的SqlAlchemy版本是1.2.10,而psycopg2版本是2.7.5。有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

set_参数期望以列名作为键,以表达式或文字作为值的映射,但是您正在传递以嵌套字典作为值的映射,即{{1} }。错误“无法适应类型'dict'”是SQLAlchemy将这些字典作为“文字”传递给Psycopg2的结果。

由于要使用VALUES子句在单个INSERT中插入多行,因此应在SET操作中使用excluded。 EXCLUDED是表示要插入的行的特殊表。

df.to_dict(orient='dict')