pypyodbc error 'Связанное утверждение не подготовлено' - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь создать функцию '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 НАЧАТЬ

ВСТАВИТЬ В ТЕСТ (имя) ЗНАЧЕНИЯ ('Джон')

КОНЕЦ

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Приведенное вами сообщение об ошибке выдается древним драйвером ODBC "SQL Server", который поставляется как часть Windows.Более новая версия драйвера, такая как «ODBC Driver 17 for SQL Server», должна выдавать значимое сообщение об ошибке.

0 голосов
/ 26 января 2019

Если вы посмотрите здесь или здесь , вы увидите, что люди жалуются на это более десяти лет назад.

Очевидно, что драйвер ODBC для SQL Server возвращает эту ошибку, когда вывыполняется два оператора, которые не выполняются из-за слишком длинного значения поля или, возможно, из-за нарушения внешнего ключа.

Использование SSMS, чтобы увидеть, какой оператор вызывает эту проблему, или лучше - прекратить использование ODBC и использовать pymssql

...