Ошибка в SQL INSERT INTO в скрипте Python - PullRequest
0 голосов
/ 29 марта 2020

Я инженер-механик с небольшим опытом работы с языками C и C ++ и опытом работы с Python или SQL лабораториями.

Недавно я начал работать над анализом цен на акции в Чтобы оптимизировать мое портфолио. Я начал с файла Excel и нескольких макросов VBA. Это работает довольно хорошо, но очень медленно. Итак, я сейчас пытаюсь ускорить и настроить правильную базу данных "цены на акции" на моем сервере ( на основе этого поста ).

В базе данных "stock_prices" есть таблица обмена, в которой хранятся все коды идентификации рынков (MI C) и соответствующая информация. Чтобы обновить таблицу обмена, раз в месяц будет запускаться сценарий python, который включает в себя следующие операторы Python / SQL.

import pymysql.cursors
conn = pymysql.connect(host='localhost', user='xxx', password='yyy', database='stock_prices')
cursor = conn.cursor()
mic_data = pd.read_excel('https://www.iso20022.org/sites/default/files/'+ str(date.year) + '-' + str(format(date.month, '02d')) + '/ISO10383_MIC.xls', sheet_name='MICs List by Country', na_filter=False)
mic_data.columns = ['country', 'iso_country_code', 'mic', 'operating_mic', 'mic_type', 'name', 'acronym', 'city', 'website', 'status_date', 'status', 'creation_date', 'comments']
for row in mic_data.itertuples(index=False):
    cursor.execute("INSERT INTO exchange(country, iso_country_code, mic, operating_mic, mic_type, name, acronym, city, website, status_date, status, creation_date, comments) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE ", row)

К сожалению, оператор "Вставить INTO" возвращает ошибку: 1064, «У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, для правильного синтаксиса для использования рядом с '' в строке 1"

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

cursor.execute("INSERT INTO exchange(country, iso_country_code, mic, operating_mic, mic_type, name, acronym, city, website, status_date, status, creation_date, comments) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE", row)
cursor.execute("INSERT INTO exchange(country, iso_country_code, mic, operating_mic, mic_type, name, acronym, city, website, status_date, status, creation_date, comments) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE;", row)
cursor.execute("""INSERT INTO exchange(country, iso_country_code, mic, operating_mic, mic_type, name, acronym, city, website, status_date, status, creation_date, comments) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE""", row)

Я также пробовал эту модификацию:

cursor.execute("INSERT INTO exchange('country', 'iso_country_code', 'mic', 'operating_mic', 'mic_type', 'name', 'acronym', 'city', 'website', 'status_date', 'status', 'creation_date', 'comments') VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE", row)

с немного отличным результатом: 1064, "У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом со" country ", 'iso_country_code' , 'mi c', 'operating_mi c', 'mic_type', 'name', 'acro' в строке 1 "

Однако я не вижу ничего особенного рядом со словом" country ".

Может кто угодно ody предлагает изменить инструкцию «INSERT INTO», которую я могу попробовать?

С наилучшими пожеланиями,

Редактировать 31/03/2020: Заявление после исправления

cursor.execute("INSERT INTO exchange(country, iso_country_code, mic, operating_mic, mic_type, name, acronym, city, website, status_date, status, creation_date, comments) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE country=%s, iso_country_code=%s, mic=%s, mic_type=%s, name=%s, acronym=%s, city=%s, website=%s, status_date=%s, status=%s, creation_date=%s, comments=%s", (row.country, row.iso_country_code, row.mic, row.operating_mic, row.mic_type, row.name, row.acronym, row.city, row.website, row.status_date, row.status, row.creation_date, row.comments,row.country, row.iso_country_code, row.mic, row.mic_type, row.name, row.acronym, row.city, row.website, row.status_date, row.status, row.creation_date, row.comments))

1 Ответ

2 голосов
/ 29 марта 2020

Нет проблем с кодом, который я проверял. Единственная проблема, с которой вы столкнулись, это то, что ON DUPLICATE KEY UPDATE требует условия, посмотрите здесь

Редактировать: у вас не может быть строк, относящихся к полям столбцов, которые вы можете использовать (`) backtick или просто оставить их такими, как они есть в запросе ниже

Ваш запрос должен выглядеть следующим образом:

INSERT INTO exchange(country, iso_country_code, mic, operating_mic, mic_type, name, acronym, city, website, status_date, status, creation_date, comments) 
VALUES('ALBANIA', 'AL', 'XALS', 'XALS', 'O', 'ALBANIA SECURITIES EXCHANGE', 'ALSE', 'TIRANA', 'WWW.ALSE.AL', 'APRIL 2019', 'ACTIVE', 'APRIL 2019', 'ALL CLASSES OF SECURITIES.') ON DUPLICATE KEY UPDATE operating_mic='XALN'

Python:

cursor.execute("INSERT INTO exchange(`country`, `iso_country_code`, `mic`, `operating_mic`, `mic_type`, `name`, `acronym`, `city`, `website`, `status_date`, `status`, `creation_date`, `comments`) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE operating_mic='XALN'", row)

ИЛИ

cursor.execute("INSERT INTO exchange(country, iso_country_code, mic, operating_mic, mic_type, name, acronym, city, website, status_date, status, creation_date, comments) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE operating_mic='XALN'", row)
...