python - 连接字符串中的无效属性:DBCNAME。使用 create_engine 和 Pandas to_sql 时
问题描述
下午,
对 python 非常陌生,但是在尝试使用sqlalchemy
create_engine
和pandas
to_sql
使用 Teradata 时,我遇到了以下错误。
错误消息 DatabaseError: (teradata.api.DatabaseError) (0, '[08001] [TPT][ODBC SQL Server Wire Protocol driver]Invalid Connection Data., [TPT][ODBC SQL Server Wire Protocol driver]Invalid attribute in connection string : DBCNAME。')
背景
我正在读取一些客户标识符并连接到许多 Teradata 数据库以提取一些信息并将其放入 pandas 数据帧,如以下代码第一节中的示例所示。这种方法重复多次并且效果很好。我现在需要将此数据插入另一个 Teradata 数据库。因此,我想使用 sqlalchmey create_engine 和 pandas to_sql
我也安装了“sqlalchemy-teradata”
执行“df_name.to_sql…”行时,代码会抛出上述错误
我已阅读以下内容,但似乎无法找到如何将 DBCNAME 传递到连接字符串,或导致错误的原因
我正在尝试使用从 tkinter https://github.com/Teradata/sqlalchemy-teradata/wiki/Examples http://docs.sqlalchemy.org/en/latest/解析变量的 dict 构建一个 sqlalchemy 引擎核心/engines.html
我安装了 Teradata SQL 助手,它使用下面的连接信息,我可以毫无问题地登录
[ODBC]
DRIVER=Teradata
UID= abcdef
DBCNAME= aaaaa.bbb.ccccccc.co.uk
我还可以从命令提示符 ping DBCname,效果很好
环境
3.6.3 |Anaconda, Inc.| (默认,2017 年 10 月 15 日,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”。该文档似乎表明它不受支持? 我正在尝试使用 dict 构建一个 sqlalchemy 引擎,该 dict 具有从 tkinter 解析的变量