MariaDB / MySQL INSERT INTO / ON DUPLICATE KEY UPDATE в Python - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь вставить INTO / ON DUPLICATE KEY UPDATE, взяв значения из одной таблицы и вставив в другую.У меня есть следующий код Python.

try:
    cursor.execute("SELECT LocationId, ProviderId FROM CQCLocationDetailsUpdates")
    rows = cursor.fetchall()
    for row in rows:
        maria_cnxn.execute('INSERT INTO CQCLocationDetailsUpdates2 (LocationId, ProviderId) VALUES (%s,%s) ON DUPLICATE KEY UPDATE ProviderId = VALUES(%s)', row)
        mariadb_connection.commit()

except TypeError as error:
    print(error)
    mariadb_connection.rollback()

Если я изменю этот сценарий просто на INSERT INTO, он будет работать нормально, проблема, как представляется, при добавлении ON DUPLICATE KEY UPDATE.Что у меня не так?LocationId это PRIMARY KEY

Я получаю эту ошибку.

Traceback (most recent call last):
  File "C:/Users/waynes/PycharmProjects/DRS_Dev/CQC_Locations_Update_MariaDB.py", line 228, in <module>
    maria_cnxn.execute('INSERT INTO CQCLocationDetailsUpdates2 (LocationId, ProviderId) VALUES (%s,%s) ON DUPLICATE KEY UPDATE ProviderId = VALUES(%s)', row)
  File "C:\Users\waynes\PycharmProjects\DRS_Dev\venv\lib\site-packages\mysql\connector\cursor.py", line 548, in execute
    stmt = RE_PY_PARAM.sub(psub, stmt)
  File "C:\Users\waynes\PycharmProjects\DRS_Dev\venv\lib\site-packages\mysql\connector\cursor.py", line 79, in __call__
    "Not enough parameters for the SQL statement")
mysql.connector.errors.ProgrammingError: Not enough parameters for the SQL statement

1 Ответ

0 голосов
/ 27 февраля 2019

Ваша ошибка связана с тем, что строка представляет собой кортеж из 2 элементов, а для оператора SQL требуется три %s переменных.

Однако можно использовать INSERT .. SELECT .. ON DUPLICATE KEY like:

maria_cnxn.execute('INSERT INTO CQCLocationDetailsUpdates2 (LocationId, 
 ProviderId)
 SELECT LocationId, ProviderId
 FROM CQCLocationDetailsUpdates orig
 ON DUPLICATE KEY UPDATE CQCLocationDetailsUpdates2.ProviderID = orig.ProviderID')

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...