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

Sea*_*rey 6 python sql postgresql pandas

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

Dec*_*cko 5

ON CONFLICT DO NOTHING这是一个关于如何使用 postgres 的示例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)
Run Code Online (Sandbox Code Playgroud)


Dmi*_*kin 0

我刚刚遇到了类似的问题,然后针对这个答案,我想出了如何发送df到的解决方案potgresSQL ON CONFLICT

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

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

Table = ABase.classes.table_name
Table.__tablename__ = 'table_name'
Run Code Online (Sandbox Code Playgroud) 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)
Run Code Online (Sandbox Code Playgroud)