powered by simpleCommunicator - 2.0.20     © 2024 Programmizd 02
Map
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Ошибка
4 сообщений из 4, страница 1 из 1
Ошибка
    #40058342
pin4uck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, только учусь - не судите строго)
Хочу написать скрипт который буде запрашивать курсы валют с сайта банка и сохранять значения в базе данных
Запрос делает выводит например([{'Cur_ID': 145, 'Date': '2021-03-30T00:00:00', 'Cur_Abbreviation': 'USD', 'Cur_Scale': 1, 'Cur_Name': 'Доллар США', 'Cur_OfficialRate': 2.6228}]). Но мне нужно только пару значений.
это запрос на сайт:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
import re
import requests
import json


URL = 'https://www.nbrb.by/api/exrates/rates?periodicity=0'


# вывод в виде списка словарей
def load_exchange():
    return json.loads(requests.get(URL).text)


def get_exchange(ccy_key):
    for exc in load_exchange():  # проходимся по словарям списка
        if ccy_key == exc['Cur_Abbreviation']:  # Если есть введенная валюта в одном из словарей, выводим этот словарь
            return exc
    return False


def get_exchanges(ccy_pattern):  
    result = []
    ccy_pattern = re.escape(ccy_pattern) + '.*'
    for exc in load_exchange():
        if re.match(ccy_pattern, exc['Cur_Abbreviation'], re.IGNORECASE) is not None:
            result.append(exc)
    return result[0]['Cur_ID'], result[0]['Cur_Abbreviation'], result[0]['Cur_OfficialRate']



А здесь работа с базой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
import sqlite3
import pb  # импорт кода который выше

def inquiry(s):
    conn = sqlite3.connect('currency.db')  # подключаемся к БД, если ее нет - создается
    curs = conn.cursor()  
    curs.execute('''CREATE TABLE IF NOT EXISTS ccy (
                    id INTEGER NOT NULL PRIMARY KEY,
                    Abbreviation TEXT UNIQUE NOT NULL ,
                    Rate FLOAT NOT NULL,
                    last_updated timestamp default (strftime('%s', 'now')))'''  
                 )

    curs.execute(f'''SELECT Rate FROM ccy 
            WHERE Abbreviation = {s} and (strftime('%s') - last_updated <= 20)''')  # ЗДЕСЬ ВОЗНИКАЕТ ОШИБКА                                                                  
    row = curs.fetchall()  # в этой переменной сохраняем значение запроса
    idd, abbr, ofcrate = pb.get_exchanges(s)
    if row:
        print('проверка(с базы)')
        return row

    curs.execute(f'''INSERT INTO ccy VALUES({idd}, {abbr}, {ofcrate}, strftime("%s"))  
                    on conflict (id) do update set Rate=excluded.Rate, last_updated = excluded.last_updated''')

    conn.commit()
    curs.execute('''SELECT Rate FROM ccy 
                    WHERE Abbreviation = {} '''.format(abbr))  # делаем запрос в таблицу БД
    row = curs.fetchall()  # сохраняем данные в переменной
    if row:  # если нет в таблице значения - делаем действия ниже:
        print('проверка(обновленное значение)')
        return row
    curs.execute('''SELECT Rate FROM ccy 
                    WHERE Abbreviation = {} '''.format(abbr))
    row = curs.fetchall()
    if row:
        print('проверка(необновленное значение)')
        return row
    result = 'Ошибка приложения'
    return result


inquiry(input('Ввод аббревиатуры валюты'))



Где первый SELECT выбрасывает ошибку если я ввожe на input() - USD:
Traceback (most recent call last):
sqlite3.OperationalError: no such column: USD - это валюта которую запрашивал

а если я введу 'USD' с кавычками - тогда не выводит значение функция get_exchange или get_exchanges.
Как сделать, чтобы SELECT не ругался? потому что без кавычек значения есть но SELECT не работает. По отдельности файлы работают, естественно во второй части необходимо было свои значения вставлять.
...
Рейтинг: 0 / 0
Ошибка
    #40058367
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pin4uck

Код: python
1.
2.
3.
4.
5.
6.
7.
    curs = conn.cursor()  
    curs.execute('''CREATE TABLE IF NOT EXISTS ccy (
                    id INTEGER NOT NULL PRIMARY KEY,
                    Abbreviation TEXT UNIQUE NOT NULL ,
                    Rate FLOAT NOT NULL,
                    last_updated timestamp default (strftime('%s', 'now')))'''  
                 )

И с каких это пор курсор таблицы создает? Это команда уровня сессии, так что conn.execute()


pin4uck

Код: python
1.
2.
    curs.execute(f'''SELECT Rate FROM ccy 
            WHERE Abbreviation = {s} and (strftime('%s') - last_updated <= 20)''')  # ЗДЕСЬ ВОЗНИКАЕТ ОШИБКА                                                                  

А с этим в учебник по питону идти. Сделай
Код: python
1.
2.
print(f'''SELECT Rate FROM ccy 
            WHERE Abbreviation = {s} and (strftime('%s') - last_updated <= 20)''')

И подумай, а чему оно должно быть равно на самом деле?
...
Рейтинг: 0 / 0
Ошибка
    #40058392
pin4uck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо
...
Рейтинг: 0 / 0
Ошибка
    #40058395
pin4uck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pin4uck, это означает что надо вовремя ложиться спать) я в первом селекте кавычки ставил, а в остальных нет, и думаю чего они не помогают, все та же ошибка выскакивает
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Ошибка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]