gpt4 book ai didi

python - Postgresql ON CONFLICT 在 sqlalchemy 中

转载 作者:太空狗 更新时间:2023-10-29 17:14:00 31 4
gpt4 key购买 nike

我已经阅读了相当多的资源(ao。12),但我无法在 sqlalchemy 中使用 Postgresql 的 ON CONFLICT IGNORE 行为。

我用过 this accepted answer作为基础,但它给出了

SAWarning: Can't validate argument 'append_string'; can't locate any SQLAlchemy dialect named 'append'

我已经尝试将 postgresql 方言添加到 @compile 子句,重命名我的对象,但它不起作用。我还尝试使用 str(insert())+ "ON CONFILCT IGNORE" 但没有结果。 (顺便说一句,不足为奇)

如何将 On CONFLICT IGNORE 添加到我的插入内容中?我喜欢建议的解决方案,因为我可以看到自己不希望每个 INSERT

上的 IGNORE 行为

附言。使用 python 2.7(不介意升级到 3.4/3.5),最新的 sqlalchemy (1.x)

最佳答案

使用 Postgres 9.6.1、sqlachemy 1.1.4 和 psycopg2 2.6.2:

  1. 将您的数据结构转换为字典。来自 Pandas

    import pandas
    from sqlalchemy import MetaData
    from sqlalchemy.dialects.postgresql import insert
    import psycopg2

    # The dictionary should include all the values including index values
    insrt_vals = df.to_dict(orient='records')
  2. 通过 sqlalchemy 连接到数据库。而是尝试下面的 psycog2 驱动程序和 native COPY 函数,它绕过所有 postgres 索引。

    csv_data = os.path.realpath('test.csv')
    con = psycopg2.connect(database = 'db01', user = 'postgres')
    cur = con.cursor()
    cur.execute("\copy stamm_data from '%s' DELIMITER ';' csv header" % csv_data)
    con.commit()
  3. 执行

    results = engine.execute(do_nothing_stmt)
    # Get number of rows inserted
    rowcount = results.rowcount

警告:

此方法不适用于开箱即用的 NaT

一切都在一起

tst_df = pd.DataFrame({'colA':['a','b','c','a','z', 'q'],
'colB': pd.date_range(end=datetime.datetime.now() , periods=6),
'colC' : ['a1','b2','c3','a4','z5', 'q6']})


insrt_vals = tst_df.to_dict(orient='records')
engine = sqlalchemy.create_engine("postgresql://user:password@localhost/postgres")
connect = engine.connect()
meta = MetaData(bind=engine)
meta.reflect(bind=engine)
table = meta.tables['tstbl']
insrt_stmnt = insert(table).values(insrt_vals)

do_nothing_stmt = insrt_stmnt.on_conflict_do_nothing(index_elements=['colA','colB'])
results = engine.execute(do_nothing_stmt)

而不是第 2 步和第 3 步,使用 psycog2 驱动程序和 postgres 中的复制命令对于较大的文件(接近演出)更快,因为它会关闭所有表索引。

csv_data = os.path.realpath('test.csv')

关于python - Postgresql ON CONFLICT 在 sqlalchemy 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33307250/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com