在 pandas.to_sql() 中使用“可调用”方法的示例?

Posted

技术标签:

【中文标题】在 pandas.to_sql() 中使用“可调用”方法的示例?【英文标题】:Example of using the 'callable' method in pandas.to_sql()? 【发布时间】:2020-05-07 18:09:18 【问题描述】:

我正在尝试创建具有 ON CONFLICT 参数的特定插入语句(我正在上传到 Postgres 数据库); df.to_sql(method='callable') 会允许吗?还是为了其他目的?我已经阅读了文档,但我无法掌握这个概念。我在这个网站和其他网站上四处寻找类似的问题,但我还没有找到一个。如果可能的话,我希望看到一个如何在实践中使用“可调用”方法的示例。关于如何使用ON CONFLICT 逻辑有效地从熊猫加载大量行的任何其他想法也将不胜感激。提前感谢您的帮助!

【问题讨论】:

好问题,不确定您是否已经找到this,但这可能会有所帮助。 嘿@Efran!我已经看到了,但我对此感到困惑。我看到他们创建了一个使用光标的函数,但我没有看到他们实际上是如何在 pandas 中使用该函数的?我确定我需要的答案在那个例子中,但它还没有为我点击。 :( 【参考方案1】:

我刚刚遇到类似的问题,然后到this answer 我想出了如何将df 发送到potgresSQL ON CONFLICT 的解决方案:

1.发送一些初始数据到数据库创建表
from sqlalchemy import create_engine
engine = create_engine(connection_string)

df.to_sql(table_name,engine)
2.添加primary key
ALTER TABLE table_name ADD COLUMN id SERIAL PRIMARY KEY;
3. 在要检查唯一性的列(或列)上准备索引
CREATE UNIQUE INDEX review_id ON test(review_id);
4.用sqlalchemy映射sql表
from sqlalchemy.ext.automap import automap_base
ABase = automap_base()

Table = ABase.classes.table_name
Table.__tablename__ = 'table_name'
6. 使用您的insert on conflict
from sqlalchemy.dialects.postgresql import insert

insrt_vals = df.to_dict(orient='records')
insrt_stmnt = insert(Table).values(insrt_vals)

do_nothing_stmt  = insrt_stmnt.on_conflict_do_nothing(index_elements=['review_id'])
results = engine.execute(do_nothing_stmt)

【讨论】:

【参考方案2】:

这是一个关于如何使用 postgres 的 ON CONFLICT DO NOTHINGto_sql 的示例

# import postgres specific insert
from sqlalchemy.dialects.postgresql import insert

def to_sql_on_conflict_do_nothing(pd_table, conn, keys, data_iter):
    # This is very similar to the default to_sql function in pandas
    # Only the conn.execute line is changed
    data = [dict(zip(keys, row)) for row in data_iter]
    conn.execute(insert(pd_table.table).on_conflict_do_nothing(), data)

conn = engine.connect()
df.to_sql("some_table", conn, if_exists="append", index=False, method=to_sql_on_conflict_do_nothing)

【讨论】:

以上是关于在 pandas.to_sql() 中使用“可调用”方法的示例?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas to_sql 在重复主键上失败

pandas to_sql if_exist参数指南

Pandas to_sql 创建表但不插入数据

使用 python 对 postgres 执行 upsert 操作,如 pandas to_sql 函数

获取从 pandas to_sql 函数插入的 ID 列表

1241, '操作数应包含 1 列' pandas to_sql