首页 > 解决方案 > 参数化数据框的列

问题描述

我想在 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().

标签: pythonsqldataframepymssql

解决方案


很难猜到为什么要在插入查询之后使用 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'))

推荐阅读