Я пытаюсь передать свои скопированные данные 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)
Действительно надеюсь, что один из вас может помочь мне, так как я почесал свою голову на этот раз!