S
S
slavamironoff2019-10-05 16:27:25
Python
slavamironoff, 2019-10-05 16:27:25

Database entry error, how to fix?

Hi everyone, I'm having trouble writing to the database.
I don’t understand what the problem is, I used to work with this module, there were no such problems.
I'm trying to pass a list with 136 elements.
Mistake

%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))

Answer the question

In order to leave comments, you need to log in

1 answer(s)
R
Rais, 2019-10-05
@0pauc0

First of all.
In the expression | "CREATE TABLE " + days + '''( | after days there will be no space before the bracket, which will give an error of course. And three apostrophes are inappropriate here. :-)
Second.
Expression | "INSERT INTO "+days+" VALUES("+s+" %s);", data) | where s was previously duplicated 135 times
implies the same number of columns in the table, but previously created with 4 columns. Columns on top, rows on the left - table! Did you mix it up by chance? :-)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question