【问题标题】:Teradata Insert Error: ValueError: The truth value of a DataFrame is ambiguousTeradata 插入错误:ValueError:DataFrame 的真值不明确
【发布时间】:2021-01-19 06:59:54
【问题描述】:

我正在尝试将 pandas 数据帧插入 Teradata 并遇到此错误。与 Teradata 的连接正在工作,因为我能够一次插入一条记录相同的数据。请帮忙。

import pandas as pd
import teradata as td

Car_Sales = pd.DataFrame([
    {"Sale_Dt":"2019-10-01", "Brand":"Mercedes","Sale_Type":"New","Dealer_Type":"Urban","SalesVol":"5"},
    {"Sale_Dt":"2019-10-02", "Brand":"BMW","Sale_Type":"Used","Dealer_Type":"Sub-Urban","SalesVol":"3"},
    ])

udaExec = td.UdaExec()
with udaExec.connect(method="odbc",DSN = "dsn1",driver = 'Teradata Database ODBC Driver 16.20') as session:
#session.execute("INSERT INTO db.tbl_Cars (Sale_Dt,Brand,Sale_Type,Dealer_Type,SalesVol) VALUES (?,?,?,?,?)",("2019-10-01","Mercedes","New","Urban",5))
query2 = "INSERT INTO db.tbl_Cars"    
session.execute(query2,Car_Sales,batch=True)

错误: ValueError:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

【问题讨论】:

  • 为什么不用pandas的@​​987654322@方法呢?还可以考虑使用teradatasqlalchemy 包而不是teradata 包加上ODBC。
  • 我可以在我的代码的下一次迭代中尝试。

标签: pandas teradata


【解决方案1】:

这可能是因为您直接将 DataFrame 传递给execute。此外,对于批量插入,文档说您必须使用executemany。 一个小例子-

session.executemany("""INSERT INTO employee (id, firstName, lastName, dob) 
                       VALUES (?, ?, ?, ?)""", 
                    ((1,"James", "Kirk", "2233-03-22"), 
                     (2,"Jean-Luc", "Picard", "2305-07-13")), 
                    batch=True)

所以,在你的情况下,它会是

with udaExec.connect(method="odbc",DSN = "dsn1",driver = 'Teradata Database ODBC Driver 16.20') as session:
    #session.execute("INSERT INTO db.tbl_Cars (Sale_Dt,Brand,Sale_Type,Dealer_Type,SalesVol) VALUES (?,?,?,?,?)",("2019-10-01","Mercedes","New","Urban",5))

    #No. of ? must be equal to number of fields in each tuple 
    query2 = "INSERT INTO db.tbl_Cars VALUES (?, ?, ...)" 

    data = tuple(tuple(x) for x in Car_Sales.values)
    session.executemany(query2, data, batch=True)

更多信息,请查看teradata的文档

【讨论】:

  • 同样的错误。 ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
猜你喜欢
  • 2018-07-06
  • 2017-11-22
  • 1970-01-01
  • 2014-10-28
  • 2020-11-14
  • 2021-11-28
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多