SQLAlchemy核心 - INSERT IGNORE和ON DUPLICATE KEY UPDATE

时间:2017-10-09 20:08:52

标签: python sqlalchemy

我正在使用SQLAlchemy Core和MySQL数据库,但我很难找到INSERT IGNORE / DUPLICATE KEY UPDATE的解决方案。如果有办法解决这个问题,我讨厌在代码中手动编写一次性查询。我发现的大多数解决方案或讨论都以ORM为中心,而不是核心。甚至其中一些是死链接。它甚至可能吗?

3 个答案:

答案 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)

On duplicate key update docs

  

现在支持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')

Insert prefix_with

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)