为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

2 回答

?
茅侃侃

TA贡献1842条经验 获得超22个赞

这是一个关于如何使用 postgres 的ON CONFLICT DO NOTHING示例to_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)


查看完整回答
反对 回复 2022-07-05
?
哔哔one

TA贡献1854条经验 获得超8个赞

我刚刚遇到了类似的问题,然后对于这个答案,我想出了如何发送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.映射sql表sqlalchemy

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)


查看完整回答
反对 回复 2022-07-05
  • 2 回答
  • 0 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号