Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python到存储过程-要执行的第一个参数必须是字符串或unicode查询_Python_Sql Server_Sqlalchemy_Pyodbc - Fatal编程技术网

Python到存储过程-要执行的第一个参数必须是字符串或unicode查询

Python到存储过程-要执行的第一个参数必须是字符串或unicode查询,python,sql-server,sqlalchemy,pyodbc,Python,Sql Server,Sqlalchemy,Pyodbc,我有一个存储过程,其中有50多个参数在表中执行insert操作,基本上是在SQL Server上通过存储过程插入数据帧。 运行代码时,出现以下错误: 要执行的第一个参数必须是字符串或unicode查询 我尝试了以下语法,但总是出现相同的错误: cursor=engine.raw\u connection.cursor 1. df.applylambda行:游标。执行'EXEC MyProcedure?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

我有一个存储过程,其中有50多个参数在表中执行insert操作,基本上是在SQL Server上通过存储过程插入数据帧。 运行代码时,出现以下错误:

要执行的第一个参数必须是字符串或unicode查询

我尝试了以下语法,但总是出现相同的错误:

cursor=engine.raw\u connection.cursor 1. df.applylambda行:游标。执行'EXEC MyProcedure?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,行值,轴=1 2. df.applylambda行:游标。执行'EXEC MyProcedure?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,行值,轴=1 3. df.applylambda行:cursor.executeEXEC MyProcedure?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,行值,轴=1 结果=listcursor.fetchall 4. df.applylambda行:游标.executetext'EXEC MyProcedure 5. df.applylambda行:cursor.execute'EXEC MyProcedure',row.values,axis=1 光标。关闭 这里不支持cursor.callproc,因此我必须执行EXEC或CALL请求。 所以我相信这是来自我的参数处理,但我不知道如何处理它。因为我有57个参数,所以我尽量避免命名所有参数。。。 我的第一个愿望是通过将过程名作为python函数的参数传递,使代码可以运行任何过程,但由于它无法运行,我选择了一种假设更简单的方法。
该过程已通过SQLServer管理直接在数据库上执行,运行良好

您可以通过使用pyodbc的cursorExecuteMay方法来简化事情:

cnxn=发动机原始连接 cnxn.autocommit=True crsr=cnxn.cursor 准备测试环境 crsr.ExecuteTRunState表MyTable清除以前的测试数据(如果有) 准备测试数据 df=pd.DataFrame[1,'Alfa',2,'Bravo'],columns=['id','txt'] sql={CALL MyProcedure?,?} 行=df.itertuplesindex=False crsr.executemanysql,行 验证结果 结果=crsr.executeSELECT*FROM MyTable.fetchall 打印结果 [1,'Alfa',2,'Bravo']
发动机是什么样的物体?我认为错误消息表明execute方法的参数有问题。另外,如果你的程序使用57!参数,可能存在设计问题。引擎是sqlalchemy引擎。它有57个参数,因为表有57列,这就是我建议重新设计的原因。通常,您不应该逐列将行传递给proc。假设您添加或删除了一列。所有代码都必须更改。如果可能的话,最好将一个键传递给proc并让它自己获取行。您使用的是哪种方言/DBAPI选项?Jython adodbapi的PyODBC mxODBC pymssql zxJDBC?我想知道这是否是一个编码问题。我使用pyodbc最新的驱动程序版本。我不知道与已经在行上迭代的df.apply相比,它是如何简化的