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