gri*_*s74 8 python sqlite sqlalchemy flask-sqlalchemy
我想用外部 API 提供的数据更新我的 SQLite 数据库,并且我不想每次都自己检查是否有任何冲突,而是想利用UPSERT语句。SQLAlchemy 1.4 版文档(仍处于测试阶段,但没关系)表明这是可能的。但我不知道如何让它与flask_sqlalchemy 一起使用。
我还尝试包含在约束定义中(如此处sqlite_on_conflict='IGNORE'1.3 版本的 SQLAlchemy 文档中所述):
class SomeModel(db.Model):
__table_args__ = (
db.ForeignKeyConstraint(
('id', 'other_id'),
('other_table.id', 'other_table.other_id')
sqlite_on_conflict='IGNORE'
),
)
# ...
Run Code Online (Sandbox Code Playgroud)
然后我用SQLALCHEMY_ECHOset to验证了 SQL 输出True,但它根本不起作用......
我尝试了 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)
Run Code Online (Sandbox Code Playgroud)
只需将此代码包含在您的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)
Run Code Online (Sandbox Code Playgroud)
这应该可以解决问题。
| 归档时间: |
|
| 查看次数: |
3212 次 |
| 最近记录: |