Я пытаюсь создать функцию 'upsert' для pypyodbc SQL Server.Я подтвердил, что созданный запрос будет работать в SSMS с желаемым результатом, но при попытке выполнить и зафиксировать с pypyodbc я получаю следующую ошибку: 'HY007', '[HY007] [Microsoft] [Драйвер ODBC SQL Server] Связанный оператор не подготовлен '.
Вот функция upsert:
def sql_upsert(sql_connection, table, key_field, key_value, **kwargs):
keys = ["{key}".format(key=k) for k in kwargs]
values = ["'{value}'".format(value=v) for v in kwargs.values()]
update_columns = ["{key} = '{value}'".format(key=k, value=v) for k, v in kwargs.items()]
sql = list()
#update
sql.append("UPDATE {table} SET ".format(table=table))
sql.append(", ".join(update_columns))
sql.append(" WHERE {} = '{}'".format(key_field, key_value))
sql.append(" IF @@ROWCOUNT=0 BEGIN ")
# insert
sql.append("INSERT INTO {table} (".format(table=table))
sql.append(", ".join(keys))
sql.append(") VALUES (")
sql.append(", ".join(values))
sql.append(")")
sql.append(" END")
query = "".join(sql)
print(query)
Функция создает строку запроса в формате, основанном нав этом другом потоке Как вставить или обновить с помощью одного запроса?
Вот пример вывода:
UPDATE test SET name = 'john' WHERE id =3012
IF @@ ROWCOUNT = 0 НАЧАТЬ
ВСТАВИТЬ В ТЕСТ (имя) ЗНАЧЕНИЯ ('Джон')
КОНЕЦ