#pandas #teradata
#pandas #teradata
Вопрос:
Я пытаюсь вставить фрейм данных 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)
Ошибка:
Ошибка значения: значение истинности фрейма данных неоднозначно. Используйте .empty , .bool(),.item(),.any() или.all() .
Комментарии:
1. Почему бы не использовать
to_sql
метод pandas? Также рассмотрите возможность использованияteradatasqlalchemy
package для этого вместоteradata
package plus ODBC.2. Я могу попробовать в следующих итерациях моего кода.
Ответ №1:
Вероятно, это связано с тем, что вы напрямую передаете 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
Комментарии:
1. Та же ошибка. Ошибка значения: значение истинности массива с более чем одним элементом неоднозначно. Используйте.any() или.all()