首页 > 解决方案 > 连接字符串中的无效属性:DBCNAME。使用 create_engine 和 Pandas to_sql 时

问题描述

下午,
对 python 非常陌生,但是在尝试使用sqlalchemy create_enginepandas 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 解析的变量

标签: pythonpandassqlalchemy

解决方案


推荐阅读