После полудня,
Очень плохо знаком с Python, но я застрял со следующей ошибкой при попытке использовать sqlalchemy
create_engine
и pandas
to_sql
с Teradata.
Сообщение об ошибке DatabaseError: (teradata.api.DatabaseError) (0, '[08001] [TPT] [Драйвер протокола ODBC SQL Server Wire] Неверные данные подключения., [TPT] [Драйвер ODBC SQL Server Wire Protocol] Недопустимый атрибут в строке подключения: DBCNAME. ')
Фон
Я читаю некоторые идентификаторы клиентов и подключаюсь кнесколько баз данных Teradata для извлечения некоторой информации и помещения ее во фреймы данных pandas, как показано в примере в первом разделе кода ниже.Этот подход повторяется несколько раз и прекрасно работает.Теперь мне нужно вставить эти данные в другую базу данных Teradata.Поэтому я хотел бы использовать sqlalchmey create_engine и pandas to_sql
Я также установил "sqlalchemy-teradata"
Код выдает вышеуказанную ошибку при выполнении строки "df_name.to_sql…"
Я прочитал следующее, но не могу найти способ передачи DBCNAME в строку подключения или причины ошибки
Я пытаюсь создать механизм sqlalchemy, используяdict, переменные которого были проанализированы с tkinter https://github.com/Teradata/sqlalchemy-teradata/wiki/Examples http://docs.sqlalchemy.org/en/latest/core/engines.html
У меня установлен помощник Teradata SQL, который использует следующую информацию о подключении, приведенную ниже, к которой я могу войти без проблем
[ODBC]
DRIVER=Teradata
UID= abcdef
DBCNAME= aaaaa.bbb.ccccccc.co.uk
Я также могу пропинговать имя DBC из командной строки, что прекрасно работает
Среда
3.6.3 | Anaconda, Inc. |(по умолчанию 15 октября 2017 г., 03:27:45) [MSC v.1900 64 бит (AMD64)] / windows 7 версия Teradata 15.10.05.04
# section one
import pandas as pd
import pyodbc
# define my sql string here
xref_query = "SELECT A, B,C, "\
"FROM someting "\
"WHERE A= " +sql_param
#connect to terdata ** this works fine**
#Specify connection string
conn = pyodbc.connect(r'DRIVER=
{Teradata};DBCName=aaaaa.bbb.ccccccc.co.uk;DATABASE=somthing;
Username=abcdef;password=ghijk')
#connect and run sql
df_xref_temp = pd.read_sql(xref_query, conn)
conn.close()
#Section two
from sqlalchemy import create_engine
#use sqlalchemy create_engine
#abcdef = teradata user name
#ghijk = teradata password
#@aaaaa.bbb.ccccccc.co.uk = teradata DBCname
td_engine = create_engine(r'teradata://abcdef:ghijk@aaaaa.bbb.ccccccc.co.uk/databas_name')
print(td_engine)
#This results in
"Engine(teradata://abcdef:ghijk:***@daaaaa.bbb.ccccccc.co.uk/database_name)"
df_name.to_sql('fos_chtax_results',con=td_engine, if_exists='append', index
=False)
Любая помощь приветствуется
Обновление утром,
После гораздо большего чтения мне удалось добиться некоторого прогресса в этой ошибке
Кажется, что если я использую соединение с именем хоста вместо соединения с DNS и указываю драйвер по умолчаниюэто работает Новый код
td_engine = create_engine("teradata://abcdef:ghijk@aaaaa.bbb.ccccccc.co.uk/database_name?driver=Teradata")
#new code using a variable
td_engine = create_engine(con_str)
Я также могу заменить текстовую строку переменной, чтобы сделать ее динамичной.Однако я хотел бы использовать метод словаря, как описано ниже, но я не могу найти способ включить дополнительную информацию о данных для подхода имени хоста, т.е. «? Driver = Teradata».Документация может показаться не поддерживаемой? Я пытаюсь создать движок sqlalchemy, используя dict, в котором переменные проанализированы из tkinter