database - Sqlalchemy upsert 关于 postgresql 上的冲突
问题描述
在 postgres 中插入我的表对 3 列具有唯一约束的数据时,我会忽略重复键。现在我在下面发布的代码仅适用于 primary_key 但不适用于唯一约束。有人有建议吗?
谢谢 E
@compiles(Insert)
def _prefix_insert_with_ignore(insert_srt, compiler, **kw):
conn = Connection()
conn_str = conn.conn_str()
test_conn = conn_str.find("sqlite")
if test_conn == 0:
return compiler.visit_insert(insert_srt.prefix_with('OR IGNORE'), **kw)
else:
#if the connection is postgresql
pk = insert_srt.table.primary_key
insert = compiler.visit_insert(insert_srt, **kw)
ondup = f"ON CONFLICT ({','.join(c.name for c in pk)}) DO NOTHING"
upsert = ' '.join((insert, ondup))
return upsert
解决方案
好的,这对我很有效
非常感谢@snakechrmerb
@compiles(Insert)
def _prefix_insert_with_ignore(insert_srt, compiler, **kw):
conn = Connection()
conn_str = conn.conn_str()
test_conn = conn_str.find("sqlite")
if test_conn == 0:
return compiler.visit_insert(insert_srt.prefix_with('OR IGNORE'), **kw)
else:
#if the connection is postgresql
ck = insert_srt.table.constraints
pk = insert_srt.table.primary_key
insert = compiler.visit_insert(insert_srt, **kw)
c = next(x for x in ck if isinstance(x, sa.UniqueConstraint))
column_names = [col.name for col in c.columns]
s= ", ".join(column_names)
ondup = f'ON CONFLICT ({s})DO NOTHING'
upsert = ' '.join((insert, ondup))
return upsert
推荐阅读
- ios - 如何更新 href 并打开 ios 应用程序?
- c++ - 如何将 std::visit 与包含枚举的 std::variant 一起使用
- ios - 如何从 Swift 中的 plist 中导入嵌套字典
- android - 在我的 React Native 应用程序中,我无法检查用户何时从 Android 中的 Branch.io 链接安装应用程序
- python - 将 python 日期格式 (%Y) 转换为 java (yyyy)
- machine-learning - 我的 StackingCVClassifier 的准确度低于基本分类器,但在测试集上表现很好
- python-3.x - 使用多列文本作为多类分类的特征
- r - 如何在 R6Class 中以私有方法访问公共成员?
- cuda - CUDA-9.2 尝试调整推力的 device_vector 时推力编译失败::complex
? - django - django设置cookie和删除cookie