繁体   English   中英

如何在flask_sqlalchemy 中使用SQLite 的UPSERT(或ON CONFLICT)?

[英]How to use SQLite's UPSERT (or ON CONFLICT) with flask_sqlalchemy?

我想用外部 API 提供的数据更新我的 SQLite 数据库,我不想每次都自己检查是否有任何冲突,相反,我想利用UPSERT语句。 1.4 版的 SQLAlchemy 文档(仍处于测试阶段,但没关系)表明这是可能的 但我不知道如何让它与flask_sqlalchemy一起工作。

我也试着包括sqlite_on_conflict='IGNORE'的约束定义(如SQLAlchemy的文档中提到的1.3版本在这里):

class SomeModel(db.Model):
    __table_args__ = (
        db.ForeignKeyConstraint(
            ('id', 'other_id'),
            ('other_table.id', 'other_table.other_id')
            sqlite_on_conflict='IGNORE'
        ),
    )
    # ...

然后我将SQLALCHEMY_ECHO设置为True验证了 SQL 输出,但它根本不起作用......

我尝试了 1.3 和 1.4 SQLAlchemy 版本。

由于我稍微编辑这个要点droustchev 的学分),我找到了解决方案。 这有点乱,但它有效:

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql import Insert


@compiles(Insert, 'sqlite')
def suffix_insert(insert, compiler, **kwargs):
    stmt = compiler.visit_insert(insert, **kwargs)
    if insert.dialect_kwargs.get('sqlite_on_conflict_do_nothing'):
        stmt += ' ON CONFLICT DO NOTHING'
    return stmt


Insert.argument_for('sqlite', 'on_conflict_do_nothing', False)

只需将此代码包含在您的models.py文件(或您拥有的任何文件名)中,然后您就可以编写:

some_random_values = [
  {'id': 1, 'some_column': 'asadsadad'},
  {'id': 2, 'some_column': 'dsawaefds'}
]

stmt = db.insert(MyModel, sqlite_on_conflict_do_nothing=True).values(some_random_values)
db.session.execute(stmt)

这应该可以解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM