psycopg2.errors.InFailedSqlTransaction: 当前事务已中止,直到事务块结束命令将被忽略

14

我编写了一个Scrapy程序来从网站上抓取数据。如果我将其抓取到JSON文件或CSV文件中,则程序可以成功抓取,但当我尝试抓取到我的PostgreSQL数据库时,出现了以下错误。下面的图片显示了我收到的错误信息。如何修复这个错误:

在此输入图片描述

def process_item(self, item, spider):
    """Save deals in the database.
    This method is called for every item pipeline component.
    """
    self.cur.execute("insert into Deals (Name,Deal_Url,Image_Url,Old_Price,Special_Price,Final_Price) values(%s,%s,%s,%s,%s,%s)",(item['Name'],item['Product_URL'],item['Image_URL'],item['Old_Price'],item['Special_Price'],item['Final_Price']))
    self.connection.commit()
    return item
1个回答

31

当事务中的操作失败时,您需要回滚,除了修复恶意操作(可能试图访问不存在的item中的任何值),您可以将插入语句包装在try / except块中:

def process_item(self, item, spider):
    """Save deals in the database.
    This method is called for every item pipeline component.
    """

    try:
        self.cur.execute("insert into Deals (Name,Deal_Url,Image_Url,Old_Price,Special_Price,Final_Price) values(%s,%s,%s,%s,%s,%s)",(item['Name'],item['Product_URL'],item['Image_URL'],item['Old_Price'],item['Special_Price'],item['Final_Price']))
        self.connection.commit()
    except:
        self.connection.rollback()
    return item

我该如何处理一些空值?我的数据库没有插入任何数据,我认为是空值导致了错误。 - PHULUSO GOVERN RAMULIFHO
您可以使用默认值,而不是 item['Name'],使用 item.get('Name', None) - Maurice Meyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接