Использование функции в цикле в Python

Моя цель — получить последнюю цену из таблицы исторических данных (History_price) и ввести ее в таблицу параметров (param_forex). Я определил следующую функцию:

    mycursor.execute(f"UPDATE `param_forex` SET `Rate` = %s, `Update_Time` = CURRENT_TIME() WHERE `param_forex`.`Ticker` LIKE %s", 
                     (Rate, Ticker))
    mydb.commit()
    mycursor.close

Функция работает сама по себе. Он просто заполняет таблицу новыми ценами на определенные строки. Теперь я пытаюсь включить это в свой цикл. На самом деле это двойной цикл из-за того, как mycursor работает в mysql.connector.

def fillpricetable_assetid() :
        for x in  ['EURUSD','EURJPY','EURGBP']:
            mycursor.execute(f"SELECT `Price` FROM `History_price` WHERE `Ticker` LIKE '{x}' ORDER BY `History_price`.`Time` DESC LIMIT 1")
            for y in mycursor:
                updateForexdb(x.lower(),y[0])

И больше не работает... я получил

  File "c:\...\library_import.py", line 116, in <module>
    fillpricetable_assetid()
  File "c:\...\library_import.py", line 89, in fillpricetable_assetid
    updateForexdb(x.lower(),y[0])
NameError: name 'updateForexdb' is not defined

Как это возможно, когда я только что определил это выше??

Нам не хватает некоторой информации, например, вы используете oop? это в классе? в каком порядке вы определили функцию?

Sparkling Marcel 03.05.2023 11:57

Где определяется updateForexdb?

God Is One 03.05.2023 11:57

updateForexdb был определен ниже в том же файле. Я вмешался, и теперь он работает нормально. Я всегда использовал функции, определенные ниже, и это всегда работало. Я не понимаю, почему в этом случае порядок, в котором они расположены, имеет значение...

Mat 03.05.2023 12:40

порядок всегда имеет значение, если вы не в классе

Sparkling Marcel 03.05.2023 14:17
Почему в 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
4
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я изменил порядок, и теперь он работает нормально.

Ответ принят как подходящий

Почему бы не выполнять несколько запросов в цикле, а просто соединить таблицы?

MySQL (любая версия):

UPDATE param_forex pf
JOIN History_price hp ON pf.Ticker = hp.Ticker
JOIN (
    SELECT Ticker, MAX(Time) AS max_time
    FROM History_price
    WHERE Ticker IN (?, ?, ?)
    GROUP BY Ticker
) hp_max ON hp.Ticker = hp_max.Ticker AND hp.Time = hp_max.max_time
SET pf.Rate = hp.Price, pf.Update_Time = NOW();

MySQL (>= 8.0):

UPDATE param_forex pf
JOIN (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Ticker ORDER BY Time DESC) rn
    FROM History_price
    WHERE Ticker IN (?, ?, ?)
    -- interval within which you know you have latest price
    AND Time > CURRENT_DATE - INTERVAL 3 DAY
) hp ON pf.Ticker = hp.Ticker AND hp.rn = 1
SET pf.Rate = hp.Price, pf.Update_Time = NOW();

Или, что еще лучше, не храните избыточные значения xrate в param_forex и просто обращайтесь напрямую из History_price. Убедитесь, что у вас есть индекс на (Ticker, Time).

Мне нравится MySQL (любая версия), спасибо! pf.Ticker ниже, а hp.Ticker заглавными буквами. Как мне это учесть?

Mat 03.05.2023 15:08

Вы можете явно установить параметры сортировки для соединения, например, - ON pf.Ticker COLLATE utf8mb4_0900_ai_ci = hp.Ticker COLLATE utf8mb4_0900_ai_ci. Какая у вас текущая кодировка/сопоставление для столбцов Ticker? Вам не нужно ничего делать, если параметры сортировки уже нечувствительны к регистру.

user1191247 03.05.2023 15:23

Или ON UPPER(pf.Ticker) = hp.Ticker.

user1191247 03.05.2023 17:38

Большое спасибо @user1191247. Мне нужно освежить свои навыки работы с mysql... Не могли бы вы помочь с другим моим сообщением с похожей проблемой?

Mat 03.05.2023 18:05

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