Не могу вставить данные в таблицу sql из элементов scrapy - PullRequest
0 голосов
/ 08 июня 2018

Это ошибки:

[scrapy.core.scraper] ERROR: Error processing {'level': None,
 'school': 'Some school name',
 'place': None,
 'subject': None}
Traceback (most recent call last):
  File "/home/reducedgosling/.virtualenvs/data/lib/python3.6/site-packages/twisted/internet/defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/home/reducedgosling/Programming/schools/pipelines.py", line 28, in process_item
    self.cur.execute(sql, data)
psycopg2.InternalError: current transaction is aborted, commands ignored until end of transaction block

items.py

class SchoolsItem(scrapy.Item):
    subject = scrapy.Field()
    level = scrapy.Field()
    place = scrapy.Field()
    school = scrapy.Field()

spider.py

def parse_school(self, response):
    item = SchoolsItem()
    school = response.css('h1 span.title::text').extract_first()
    table_rows = response.css('tr')
    for x in table_rows:
        item['subject'] = x.css('td.views-field-title a::text').extract_first()
        item['level'] = x.css('td.views-field-field-level').xpath('normalize-space(./text())').extract_first()
        item['place'] = x.css('td.views-field-field-campus').xpath('normalize-space(./text())').extract_first()
        item['school'] = school
        yield item

pipelines.py

def process_item(self, item, spider):
    sql = "INSERT INTO udir_content (subject, level, school, place) VALUES (%s, %s, %s, %s);"
    data = (item['subject'], item['level'], item['school'], item['place'])
    self.cur.execute(sql, data)
    self.connection.commit()
    return item

Что я делаю не так?Я подозревал значения Null, которые Python (или psycopg?) Превращает в значения None?Но PostgreSQL принимает нулевые значения, если я не укажу NOT NULL, верно?

Первая ошибка, которая отображается в файле журнала psql, такова:

ERROR:  relation "udir_content" does not exist at character 13
STATEMENT:  INSERT INTO udir_content (subject, level, school, place) VALUES (NULL, NULL, 'Some school name', NULL);

Остальное просто говорит "транзакция прервана".

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Немного узнал о PostgreSQL, потратив два часа на то, чтобы понять, что я создал таблицу в базе данных postgres, а не ту, которую я создал для этого.Тогда мне пришлось предоставить права второго пользователя, и теперь все в порядке.

0 голосов
/ 08 июня 2018

У вас проблема с INSERT, сообщается об ошибке: вставка завершилась неудачно, и вы не откатили транзакцию перед выполнением другой.

В execute следует использовать вопросительные знаки в качестве заполнителей (?) не %s

Так что для вашего заявления вы должны использовать

sql = "INSERT INTO udir_content (subject, level, school, place) VALUES (?, ?, ?, ?);"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...