【发布时间】:2017-07-30 10:35:12
【问题描述】:
我看到的大多数示例是人们使用 ON CONFLICT DO UPDATE 语法将单行插入数据库。
有人有使用 SQLAlchemy 或 pandas.to_sql 的示例吗?
我 99% 的插入使用 psycopg2 COPY 命令(所以我保存了 csv 或 stringio,然后进行批量插入),另外 1% 使用 pd.to_sql。我检查新行或新维度的所有逻辑都是在 Python 中完成的。
def find_new_rows(existing, current, id_col):
current[id_col] = current[id_col].astype(int)
x = existing[['datetime', id_col, 'key1']]
y = current[['datetime', id_col, 'key2']]
final = pd.merge(y, x, how='left', on=['datetime', id_col])
final = final[~(final['key2'] == final['key1'])]
final = final.drop(['key1'], axis=1)
current = pd.merge(current, final, how='left', on=['datetime', id_col])
current = current.loc[current['key2_y'] == 1]
current.drop(['key2_x', 'key2_y'], axis=1, inplace=True)
return current
谁能给我看一个使用 pyscopg2 进行 upsert 的新 PostgreSQL 语法的示例?一个常见的用例是检查维度变化(每天在 50k - 100k 行之间,我将其与现有值进行比较),这是 CONFLICT DO NOTHING 只添加新行。
另一个用例是我有随时间变化的事实数据。我只取最近的值(我目前使用视图来选择不同的),但如果可能的话,最好使用 UPSERT。
【问题讨论】:
标签: pandas psycopg2 postgresql-9.5