Моя цель — получить последнюю цену из таблицы исторических данных (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
Как это возможно, когда я только что определил это выше??
Где определяется updateForexdb?
updateForexdb был определен ниже в том же файле. Я вмешался, и теперь он работает нормально. Я всегда использовал функции, определенные ниже, и это всегда работало. Я не понимаю, почему в этом случае порядок, в котором они расположены, имеет значение...
порядок всегда имеет значение, если вы не в классе






Я изменил порядок, и теперь он работает нормально.
Почему бы не выполнять несколько запросов в цикле, а просто соединить таблицы?
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 заглавными буквами. Как мне это учесть?
Вы можете явно установить параметры сортировки для соединения, например, - ON pf.Ticker COLLATE utf8mb4_0900_ai_ci = hp.Ticker COLLATE utf8mb4_0900_ai_ci. Какая у вас текущая кодировка/сопоставление для столбцов Ticker? Вам не нужно ничего делать, если параметры сортировки уже нечувствительны к регистру.
Или ON UPPER(pf.Ticker) = hp.Ticker.
Большое спасибо @user1191247. Мне нужно освежить свои навыки работы с mysql... Не могли бы вы помочь с другим моим сообщением с похожей проблемой?
Нам не хватает некоторой информации, например, вы используете oop? это в классе? в каком порядке вы определили функцию?