Python SqlAlchemy IntegrityError

Python SqlAlchemy IntegrityError,python,database,sqlite,database-design,sqlalchemy,Python,Database,Sqlite,Database Design,Sqlalchemy,我正试图从facebook上获取大量数据,并在处理这些数据时向数据库中添加对象。例如,对于like,我只是让它们成为发布like的人的ID。但是,当我添加多个类似的时,我将在sqlalchemy中遇到一个完整性错误,因为主键不是唯一的 处理这个问题的最佳方法是什么?每次我要向数据库中添加一个新的like时,是否都要进行查询,找出它是否存在,如果存在则增加其计数,如果不存在则创建一个新条目 这不是有很多疑问吗?您认为最好做什么?您真的需要针对重载优化它吗?可能不会,因为您正在使用SQLite。在这

我正试图从facebook上获取大量数据,并在处理这些数据时向数据库中添加对象。例如,对于like,我只是让它们成为发布like的人的ID。但是,当我添加多个类似的时,我将在sqlalchemy中遇到一个完整性错误,因为主键不是唯一的

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


这不是有很多疑问吗?您认为最好做什么?

您真的需要针对重载优化它吗?可能不会,因为您正在使用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
,以避免检查(有两个单独的语句尚未执行):

最后,有一种方法可以在单个语句中使用
INSERT或REPLACE
和subselect(在大多数其他数据库中也有其他方法可以这样做,例如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)
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)