我试图从Facebook获取大量数据,并在处理它们时将对象添加到数据库中.例如,对于喜欢,我只是将它们作为发布类似的人的ID.但是,当我添加多个时,我会在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或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(在大多数其他数据库中还有其他方法可以做这样的事情,例如MySQL中的ON DUPLICATE KEY),但我怀疑它会给你带来明显的性能提升:
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)
原文地址:https://codeday.me/bug/20190531/1187714.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。