gpt4 book ai didi

python - SqlAlchemy 完整性错误

转载 作者:太空狗 更新时间:2023-10-30 02:34:55 25 4
gpt4 key购买 nike

我正在尝试从 facebook 获取大量数据,并在处理它们时将对象添加到数据库中。比如点赞,我只是把他们做成点赞的人的ID。但是,当我添加多个 like 时,我会在 sqlalchemy 中遇到完整性错误,因为主键不是唯一的。

处理此问题的最佳方法是什么?每次我要向数据库添加一个新的点赞时,我是否都必须进行查询,查明它是否存在,如果存在则增加其计数,如果不存在则创建一个新条目?

这看起来不是很多查询吗?你认为最好做什么?

最佳答案

您真的需要针对重负载对其进行优化吗?可能不会,因为您正在使用 SQLite。在这种情况下,简单的解决方案要好得多:

class Like(Base):
__tablename__ = 'Like'
id = Column(Integer, primary_key=True)
counter = Column(Integer, nullable=False, default=0)


o = session.merge(Like(id=1))
session.flush() # Required when it's new record
o.counter = Like.counter+1
session.commit()

检查和插入之间存在竞争条件,但我相信它不会在实践中打败你。

当你真的需要稍微优化它或修复这个竞争条件时,SQLite 中有一个 INSERT OR IGNORE 来避免检查(还有 2 个单独的语句被执行):

clause = Like.__table__.insert(prefixes=['OR IGNORE'],
values=dict(id=1, counter=0))
session.execute(clause)
o = session.merge(Like(id=1, counter=Like.counter+1))
session.commit()

最后有一种方法可以在单个语句中使用 INSERT OR REPLACE 和 subselect(在大多数其他数据库中还有其他方法可以做到这一点,例如 ON DUPLICATE KEY 在 MySQL 中),但我怀疑它会给你带来显着的性能提升:

old = session.query(Like.counter).filter_by(id=1).statement.as_scalar()
new = func.ifnull(old, 0) + 1
clause = Like.__table__.insert(prefixes=['OR REPLACE'],
values=dict(id=1, counter=new))
session.execute(clause)

关于python - SqlAlchemy 完整性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com