我有下表:
class Feedback(Base):
__tablename__ = 'feedbacks'
__table_args__ = (UniqueConstraint('user_id', 'look_id'),)
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
look_id = Column(Integer, ForeignKey('looks.id'), nullable=False)
我目前正在向这个表中插入很多条目,这将违反UniqueConstraint。在
我使用以下代码:
^{pr2}$我得到了以下错误:
IntegrityError (IntegrityError) duplicate key value violates unique constraint "feedbacks_user_id_look_id_key"
DETAIL: Key (user_id, look_id)=(140, 263008) already exists.
'INSERT INTO feedbacks (user_id, look_id, score) VALUES (%(user_id)s, %(look_id)s, %(score)s) RETURNING feedbacks.id' {'user_id': 140, 'score': 1, 'look_id': 263008}
IntegrityError (IntegrityError) duplicate key value violates unique constraint "feedbacks_user_id_look_id_key"
...
(there's about 24 of these integrity errors here)
...
DETAIL: Key (user_id, look_id)=(173, 263008) already exists.
'INSERT INTO feedbacks (user_id, look_id, score) VALUES (%(user_id)s, %(look_id)s, %(score)s) RETURNING feedbacks.id' {'user_id': 173, 'score': 1, 'look_id': 263008}
No handlers could be found for logger "sqlalchemy.pool.QueuePool"
Traceback (most recent call last):
File "load.py", line 40, in <module>
load_crawl_data_into_feedback()
File "load.py", line 21, in load_crawl_data_into_feedback
for comment in session.query(Comment).filter(Comment.type == Comment.TYPE_LOOK).yield_per(100):
File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2337, in instances
fetch = cursor.fetchmany(self._yield_per)
File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 3230, in fetchmany
self.cursor, self.context)
File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 3223, in fetchmany
l = self.process_rows(self._fetchmany_impl(size))
File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 3343, in _fetchmany_impl
row = self._fetchone_impl()
File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 3333, in _fetchone_impl
self.__buffer_rows()
File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 3326, in __buffer_rows
self.__rowbuffer = collections.deque(self.cursor.fetchmany(size))
sqlalchemy.exc.ProgrammingError: (ProgrammingError) named cursor isn't valid anymore None None
在你下结论说这个错误是由收益率引起的之前,我可以向你保证收益率不是这里的罪魁祸首。在
我在没有唯一约束的情况下尝试了相同的代码,并且没有遇到任何错误。在
我认为完整性错误导致找不到记录器的处理程序“sqlalchemy.pool.QueuePool“。在
我假设每个完整性错误都会杀死队列池中的每个“线程”。在
有人能告诉我发生了什么事吗?在
如果我在这一点上不能做太多的数据,你会建议我做什么?在
这个错误只是来自Python
logging
模块;您的pool类试图记录一些调试消息,但是您没有配置SQLA日志记录。Configuring logging很简单,然后你就可以看到它到底想说什么。在我不太清楚这里发生了什么,但如果您将顶级事务回滚数十次,这肯定没有帮助。回滚结束事务并使每个活动行对象无效。这肯定不会与
yield_per
很好地交互。在如果您的数据库支持保存点或嵌套事务(即Postgres或Oracle。。。或者是最近的MySQL,尝试为每次尝试启动嵌套事务:
with
在错误时回滚并在成功时提交,因此失败的flush
不会对主事务的其余部分造成严重破坏。在如果您没有后端支持,其他明智的选择是:
使查询复杂化:对您的反馈表执行
LEFT JOIN
操作,以便在应用程序中知道反馈行是否已经存在。如果您愿意将} 。这类似于基于主键的insert或update:如果SQLA可以找到具有相同pk的现有行,它将更新该行,否则它将在数据库中创建一个新的行。但是,会冒着为每一个新行触发额外的
(user_id, look_id)
作为您的主键,我想您可以使用^{SELECT
的风险。“在你对这个错误是由收益率引起的结论之前,我可以向你保证,收益率不是这里的罪魁祸首。”在
我不知道为什么你会认为-yield_per()在这里非常重要,这可以通过简单地尝试相同的测试来快速预测,而不需要使用yield_per()来查看行为是否不同。通过使用yield_per(),psycopg2光标在循环继续时保持打开状态。但是,您将通过
session.rollback()
对psycopg2连接发出回滚。这将导致出现“命名游标不再有效”之类的错误。实际上,的唯一原因是是一个命名游标,因为这就是使用psycopg2执行服务器端游标的方法,psycopg2是yield_per()启用的功能的一部分。在“我尝试了相同的代码,但没有遇到任何错误。”
这是因为没有约束,不会抛出异常,并且rollback()不会命中。在
相关问题 更多 >
编程相关推荐