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]=?'
Другие вопросы по тегам