我正在使用SQLAlchemy Core和MySQL数据库,但我很难找到INSERT IGNORE / DUPLICATE KEY UPDATE的解决方案。如果有办法解决这个问题,我讨厌在代码中手动编写一次性查询。我发现的大多数解决方案或讨论都以ORM为中心,而不是核心。甚至其中一些是死链接。它甚至可能吗?
答案 0 :(得分:3)
我知道有点晚了......但如果有人还在寻找解决方案。
FOR:ON DUPLICATE KEY UPDATE
ins = insert(/* table_name*/ ).values(/*your values(with PK)*/)
do_update_stmt = ins.on_duplicate_key_update(/*your values(with out PK)*/)
connection.execute(do_update_stmt)
现在支持MySQL支持的INSERT的ON DUPLICATE KEY UPDATE子句,使用特定于MySQL的版本的Insert对象
sqlalchemy.insert()
无法使用。
FOR:INSERT IGNORE
这有点hacky但工作得很好。
ins_address_stmt = insert(/* table_name*/ ).values(/*your values*/). \
prefix_with('IGNORE')
MySQL将禁止重复主键的错误并发出警告。
答案 1 :(得分:0)
shaktimaan的答案对MySQL INSERT IGNORE非常有用。如果您发现此页面正在寻找SQLite INSERT IGNORE,请记住执行INSERT或IGNORE
https://www.sqlite.org/lang_insert.html
stmt = insert(/* table_name*/ ).values(/*your values*/).prefix_with('OR IGNORE')
答案 2 :(得分:0)
SQL 模式
print '--------- test upsert --------------'
for r in rows:
r['value'] = r['id'] + 1
sql = '''
INSERT INTO test (id, value)
VALUES (:id, :value)
ON DUPLICATE KEY UPDATE value = VALUES(value)
'''
start = time.time()
engine.execute(text(sql), rows)