python - pypyodbc 错误 'Associated statement is not prepared'

标签 python sql pypyodbc

我正在尝试为 pypyodbc SQL Server 创建一个“upsert”函数。我已经验证建立的查询将在 SSMS 中运行并获得所需的结果,但是当尝试使用 pypyodbc 执行和提交时,我收到以下错误:'HY007', '[HY007] [Microsoft][ ODBC SQL Server 驱动程序]未准备关联语句'

这是更新插入函数:

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)

该函数以基于此其他线程的格式构建查询字符串 How to insert or update using single query?

这是一个输出示例:

更新测试 SET name='john' WHERE id=3012

如果@@ROWCOUNT=0 开始

插入测试(名称)值('约翰')

结束

最佳答案

您引用的错误消息是由作为 Windows 的一部分提供的古老“SQL Server”ODBC 驱动程序生成的。更新的驱动程序版本(如“ODB​​C Driver 17 for SQL Server”)应该会产生有意义的错误消息。

关于python - pypyodbc 错误 'Associated statement is not prepared',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373654/

相关文章:

python - 如果 code-block::does 没有可选参数,Sphinx highlight_language 配置选项有什么意义?

python - Django 管理员 "Edit Selection"操作?

mysql - 克服多余的行

php - 从数据库动态加载博客文章

python - "Execution failed on sql"用于使用 pandas.read_sql 和 MSAccess 的特定表名

python - 使索引数组的循环更快

python - 棉花糖嵌套 post_load 对象创建

mysql - SQL数据重复

python - 错误 - 多级文件夹内的 pypyodbc.win_create_mdb

python - 如何在python中调用带有这么多参数的SQL Server存储过程?