SQLAlchemy + Scrapy: ошибка первичного ключа уже существует неправильно - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь передать свои скопированные данные Scrapy прямо в базу данных postgresql, используя SQLAlchemy. Мне удалось установить соединение, однако ничего не пишется, и я получаю сообщение об ошибке при записи каждого элемента в базу данных:

DETAIL: Key (hash_id)=(2122600700) already exists.
[SQL: 'UPDATE spider SET hash_id=%(hash_id)s'] [parameters: {'hash_id': 2122600700}]

Это не так, поскольку я проверил свою базу данных (всего 60 элементов) и попытался очистить элементы с разными первичными ключами (hash_ids). Я, должно быть, что-то упускаю из-за того, как SQLAlchemy и Scrapy обрабатывают элементы, это мой конвейер:

pipeline.py

class PgPipeline(object):
    def __init__(self):
        """
        Initializes database connection.
        Reflects the spider table.
        """
        engine = db_connect()
        self.spiderDB = load_table(engine)
        self.conn = engine.connect()

    def process_item(self, item, spider):
        """Save listings in the database.

        This method is called for every item pipeline component.
        """
        stmt = self.spiderDB.update().values(item)
        self.conn.execute(stmt)
        return item

    def close_spider(self, spider):
        self.conn.close()

models.py

metadata = MetaData()


def db_connect():
    """
    Performs database connection using database settings from settings.py.
    Returns sqlalchemy engine instance
    """
    return create_engine(URL(**settings.DATABASE))


def load_table(engine):
    """
    Reflects the spider table in the DB
    """
    return Table('spider', metadata, autoload=True, autoload_with=engine)

Действительно надеюсь, что один из вас может помочь мне, так как я почесал свою голову на этот раз!

1 Ответ

0 голосов
/ 07 июля 2018

Я использовал обновление неправильно, поэтому использование insert () вместо этого работало как шарм. Также добавление предложенного on_conflict из документации решило мою проблему. Работали!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...