Python 参数化数据帧的列

Python 参数化数据帧的列,python,sql,dataframe,pymssql,Python,Sql,Dataframe,Pymssql,我想在cursor.execute函数中参数化列和数据帧。我使用pymssql,因为我喜欢这样一个事实:我可以命名参数化的列。但是我仍然不知道如何正确地告诉python我指的是一个特定的数据帧,我想使用这个列。这是我的代码的最后一部分(我已经测试了与数据库的连接等,并且可以正常工作): 我得到了这个错误: ValueError Traceback (most recent call last) <ipython-input-52

我想在cursor.execute函数中参数化列和数据帧。我使用pymssql,因为我喜欢这样一个事实:我可以命名参数化的列。但是我仍然不知道如何正确地告诉python我指的是一个特定的数据帧,我想使用这个列。这是我的代码的最后一部分(我已经测试了与数据库的连接等,并且可以正常工作):

我得到了这个错误:

ValueError                                Traceback (most recent call last)
<ipython-input-52-037e289ce76e> in <module>
     10 with conn:
     11     cursor = conn.cursor()
---> 12     cursor.execute("""insert into [dbo].[testdb] (day, revenue) values (%(day)s, %(revenue)s""", dataframe)
     13     result= cursor.fetchall()
     14 

src\pymssql.pyx in pymssql.Cursor.execute()

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1477     def __nonzero__(self):
   1478         raise ValueError(
-> 1479             f"The truth value of a {type(self).__name__} is ambiguous. "
   1480             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1481         )

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

ValueError回溯(最近一次调用)
在里面
10与康涅狄格州:
11游标=连接游标()
--->12 cursor.execute(““”插入[dbo].[testdb](天,收入)值(%(天)s,%(收入)s“”,数据帧)
13 result=cursor.fetchall()
14
pymssql.Cursor.execute()中的src\pymssql.pyx
~\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\generic.py in\uuuuu非零(self)
1477定义非零(自):
1478升值错误(
->1479F“一个{type(self)。{name}的真值是不明确的。”
1480“使用a.empty、a.bool()、a.item()、a.any()或a.all()
1481         )
ValueError:数据帧的真值不明确。请使用a.empty、a.bool()、a.item()、a.any()或a.all()。

很难猜出为什么要在插入查询之后使用fetchall:fetchall通常用于select查询

execute
通常在表中插入一行。如果您想一次插入多行,PEP-249建议使用
executemany
。但问题在于,参数应该是一个可编辑的记录:如果您使用位置参数(
:1
,…),或使用命名参数的映射的iterable。数据帧不是这样。但您可以使用
.to_dict(orient='record)
将其转换为dict列表。因此,这应该可以工作(它在我使用SQLite3的测试中起作用):


我明白了我的问题所在。由于我将数据框转换为字典(使用数据框。to_dict'index'),字典是一个嵌套的字典。我用
dataframe[0]
引用了它,它起了作用。以防万一有人有同样的问题。

你应该显示一个(几乎)真正的查询,并说明您希望如何更改它。目前我只看到一个插入查询,后跟一个fetchall(???)和一条显然不相关的错误消息。我编辑了查询并插入了整个错误消息。我希望这有助于理解我的问题。谢谢你的建议!我会尝试一下。我仍然有fetchall语句,因为我用select语句测试了我的连接。我尝试了一下,得到了这个错误src\pymssql.pypymssql.Cursor.execute()src_mssql.pyx in_mssql.MSSQLConnection.execute_query()src_mssql.pyx in_mssql.MSSQLConnection.execute_query()src_mssql.pyx in_mssql.MSSQLConnection.format_和_run_query()src_mssql.pyx in_mssql.MSSQLConnection.format_sql命令()src__mssql.pyx in_ql.mssql.pyx in_替换_params ValueError:'params'arg()只能是一个元组或一个字典。@Fullbringa:刚刚意识到我写了
execute
当is应该是
executemany
时,我担心这也没有产生预期的结果。我仍然收到一条错误消息:ProgrammingError:(102,b“语法不正确”('.DB Lib错误消息20018,严重性15:\n一般SQL Server错误:检查来自SQL Server的消息\n”)@Fullbringa:这一条我可以理解!我盲目复制了您问题中的SQL文本,最后的
丢失了…我刚刚在回答中修复了它
ValueError                                Traceback (most recent call last)
<ipython-input-52-037e289ce76e> in <module>
     10 with conn:
     11     cursor = conn.cursor()
---> 12     cursor.execute("""insert into [dbo].[testdb] (day, revenue) values (%(day)s, %(revenue)s""", dataframe)
     13     result= cursor.fetchall()
     14 

src\pymssql.pyx in pymssql.Cursor.execute()

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1477     def __nonzero__(self):
   1478         raise ValueError(
-> 1479             f"The truth value of a {type(self).__name__} is ambiguous. "
   1480             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1481         )

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

cursor.executemany("""insert into [dbo].[testdb] (day, revenue) values (%(day)s, %(revenue)s)""",
                dataframe.to_dict(orient='record'))