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

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

Войти через центр авторизации
Похожие вопросы
от 75 000 до 90 000 руб.
Хантфлоу Москва
от 60 000 до 80 000 руб.
от 100 000 до 150 000 руб.
17 нояб. 2019, в 17:42
3000 руб./за проект
17 нояб. 2019, в 17:42
2000 руб./за проект
17 нояб. 2019, в 16:10
3500 руб./за проект