python - 参数化数据框的列
问题描述
我想在 cursor.execute 函数中参数化列和我的数据框。我正在使用 pymssql,因为我喜欢可以命名参数化列的事实。但是我仍然不知道如何正确地告诉 python 我指的是一个特定的数据框,我想使用这些列。这是我的代码的最后一部分(我已经测试了到我的数据库等的连接并且它可以工作):
with conn:
cursor = conn.cursor()
cursor.execute("""insert into [dbo].[testdb] (day, revenue) values (%(day)s, %(revenue)s)""", dataframe)
result = cursor.fetchall()
for row in result:
print(list(row))
我收到此错误:
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().
解决方案
很难猜到为什么要在插入查询之后使用 fetchall:fetchall 通常用于选择查询。
execute
通常在表中插入一行。executemany
如果您想一次插入多行,建议使用 PEP-249 。但是问题在于参数应该是记录的可迭代:如果您使用位置参数(?
或:1
,...),则为可迭代的可迭代,如果使用命名参数,则为映射的可迭代。数据框不是那样的。但是您可以将其转换为带有.to_dict(orient='record)
. 所以这应该有效(它在我使用 SQLite3 的测试中有效):
cursor.executemany("""insert into [dbo].[testdb] (day, revenue) values (%(day)s, %(revenue)s)""",
dataframe.to_dict(orient='record'))
推荐阅读
- makefile - Makefile 不跟踪修改过的 Python 文件
- html - bootstrap 4的列对齐(行内)问题
- feature-scaling - 当我使用特征缩放训练模型时,如何从用户输入中找到最小最大标量特征缩放的单个值?
- javascript - jQuery slimScroll 插件不包含子节点内的缩进
- apache-kafka - Kafka:在 60000 毫秒内初始化事务状态时超时
- javascript - Web 组件的影子根:打开与关闭
- android-studio - Android Studio - 应用对模块的依赖,(OpenCv 模块)
- c++ - 我不明白为什么 __except 没有启动
- arrays - 数据结构(基于队列的问题)
- reactjs - React-DatePicker 布局问题。有人知道如何解决吗?