Не удается вставить данные в таблицу sql из элементов scrapy

Это ошибки:

[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);

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

Связанный: stackoverflow.com/questions/2979369/…

Tony 08.06.2018 12:16

Ваша таблица udir_content названа с использованием строчных букв в БД? Вам нужно точно соответствовать (с учетом регистра).

Tony 08.06.2018 13:42

@Tony да, все строчные буквы и без кавычек

Hills 08.06.2018 14:03

Следующее, что нужно проверить, - используете ли вы схемы? Таблица в схеме по умолчанию или в другой созданной вами?

Tony 08.06.2018 14:10

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

Hills 08.06.2018 14:25

Приятно знать, что вы нашли ответ. По возможности отметьте свой ответ как «принятый», чтобы другие знали, что вы нашли решение.

Tony 08.06.2018 14:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
383
2

Ответы 2

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

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

Итак, для вашего утверждения вы должны использовать

sql = "INSERT INTO udir_content (subject, level, school, place) VALUES (?, ?, ?, ?);"

Я изменил его, но получаю эту ошибку: psycopg2.ProgrammingError: синтаксическая ошибка на "," СТРОКА 1: ... dir_content (уровень предмета, школа, место) ЗНАЧЕНИЯ (?,?,?,?) ...

Hills 08.06.2018 12:34

Извините, я использую SQLite и доволен ?, для Postgres кажется, что вы были правы с %s. Однако вам все равно необходимо проверить свой оператор SQL на наличие ошибок. Вызовите mogrify(), чтобы получить выполняемый оператор sql, и протестируйте его в своей базе данных, чтобы узнать, какую ошибку вы получаете - initd.org/psycopg/docs/cursor.html#cursor.mogrify

Tony 08.06.2018 13:12

Спасибо! Я обновил свой вопрос с ошибкой из файла журнала psql.

Hills 08.06.2018 13:16

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

Другие вопросы по теме