@slavamironoff

Ошибка записи в базу, как исправить?

Всем привет, столкнулся с проблемой записи в базу данных.
Не пойму в чём проблема, раньше работал с этим модулем, таких проблем не возникало.
Пытаюсь передать список, в котором 136 элементов.
Ошибка
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 
Traceback (most recent call last):
  File "cbr.py", line 110, in <module>
    print(a.data_sampling(b))
  File "cbr.py", line 103, in data_sampling
    insert(data)
  File "cbr.py", line 74, in insert
    _f.execute("INSERT INTO "+days+" VALUES("+s+" %s);", data)
psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block


import requests, browser_cookie3, psycopg2, datetime
from bs4 import BeautifulSoup


class CBR:
    ''' Класс описывающий работу парсера.
        Происходит инициализация url, за тем следует 
        метод подключения к серверу и метод записи в csv файл, 
        который вызывается в методе забора данных.
        Следом идёт метод записи в базу данных из csv, в методе 
        присутствует функция инструкции подключения. После записи в базу, файл очищается. '''

    def __init__(self):
        ''' Метод инициализации url '''
        self.url = 'https://cbr.ru/currency_base/daily/?date_req=03.10.2019'


    def connect(self):
        ''' Метод подключения к серверу.
            Метод включает проверку на ответ Response '''
        browser = browser_cookie3.firefox()
        resp = requests.get(self.url, cookies=browser)

        if resp.status_code == 200:
            return resp.text
        else:
            return 'Error - ' + str(resp.status_code)

    
    def data_sampling(self, connect):
        ''' Метод data sampling принемает результат из метода connect
            Забор данных происходит в следующем ключе:
            1) Происходит сканирование страницы.
            2) Происходит поиск таблице
            3) из таблицы забираем данные по "Валюта" и "Курс", а так же
                "Букв. код" и "Цифр. код" '''


        # Подключение к базе данных
        try:
            conn = psycopg2.connect(
                database = 'cbr',
                host = 'localhost',
                user = 'postgres',
                password = '1'
            )
            _f = conn.cursor()
        except:
            return "No connect database!"

        days = "cbr_" + str(datetime.datetime.today().strftime('%Y_%m_%d'))

        def table():
            ''' Функция создаёт новую таблицу в базе
                на каждый день '''
            try:
                CT = _f.execute("CREATE TABLE " + days + '''(
                    digital_code varchar NOT NULL,
                    letter_code varchar NOT NULL,
                    name varchar NOT NULL,
                    value varchar NOT NULL,
                    PRIMARY KEY (letter_code))''')
                conn.commit()
                return "True"
            except:
                return "Table already exist!"
        table()


        def insert(data):
            # Функция записывает данные в таблицу
            s = '%s, ' * 135
            print(s)
            _f.execute("INSERT INTO "+days+" VALUES("+s+" %s);", data)
            conn.commit()
            return "True"

        
        bs = BeautifulSoup(connect, 'lxml')

        table = bs.find('table').find('tbody')
        tr_array = table.find_all('tr')[1:]

        data = []

        for tr in tr_array:
            td = tr.find_all('td')

            digital_code = td[0].text
            data.append(digital_code)

            letter_code = td[1].text
            data.append(letter_code)

            name = td[3].text
            data.append(name)

            value = td[4].text
            data.append(value)

        print(len(data))
        insert(data)
        
        return True

        
a = CBR()
b = a.connect()
print(a.data_sampling(b))
  • Вопрос задан
  • 529 просмотров
Пригласить эксперта
Ответы на вопрос 1
@0pauc0
Во-первых.
В выражении | "CREATE TABLE " + days + '''( | после days не будет пробела перед скобкой, что даст ошибку конечно. И три апострофа здесь неуместны. :-)
Второе.
Выражение | "INSERT INTO "+days+" VALUES("+s+" %s);", data) |, где s ранее продублирована 135 раз,
подразумевает такое же количество столбцов в таблице, но ранее она создана с 4 столбцами. Столбцы сверху, строки слева - таблица! Не перепутали случайно? :-)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы