Python3 pyodbc динамически построить запрос на обновление
Как я могу динамически построить запрос на обновление, когда число и имена полей, которые я обновляю, различны, без необходимости настраивать разные запросы на обновление для каждого отдельного оператора обновления.
Я новичок в python, но в других языках я видел, как это делается с парой ключ-значение, где вы динамически делаете что-то вроде:
UPDATE my_table SET key1 = value1 WHERE key2 = value2
Затем вы передадите массив пар "ключ-значение" в функцию и начнете.
Это лучший способ сделать это в Python, чтобы просто создать строку обновления и передать в поля? Что-то вроде:
"UPDATE my_table SET {} = ? WHERE {} = ?".format(key1, key2)
Тогда, я думаю, вам придется отдельно передавать параметры в pyodbc.executemany?
Но тогда я не уверен, как вы будете обрабатывать переменное количество полей для обновления. Я уверен, что есть способ сделать это легко, так что, надеюсь, кто-то может подсказать мне.
1 ответ
Да, с ванильным Python и pyodbc описанный вами основной процесс является правильным. Если у вас есть список имен столбцов для обновления
>>> col_names_to_set = ['LastName', 'FirstName']
Вы можете построить необходимые элементы для предложения SET,
>>> set_tokens = ','.join([f'{x}=?' for x in col_names_to_set])
>>> set_tokens
'LastName=?,FirstName=?'
включить это в ваш текст команды SQL,
>>> sql = f"UPDATE TableName SET {set_tokens} WHERE ..."
>>> sql
'UPDATE TableName SET LastName=?,FirstName=? WHERE ...'
а затем передать это заявление executemany
вместе с вашим списком кортежей, содержащих значения для обновления.
Обратите внимание, что в целях безопасности вы, вероятно, должны заключать имена столбцов в разделители для своего диалекта SQL, например, для SQL Server (T-SQL):
>>> set_tokens = ','.join([f'[{x}]=?' for x in col_names_to_set])
>>> set_tokens
'[LastName]=?,[FirstName]=?'