【问题标题】:Is there a way to store pandas dataframe to a Teradata table有没有办法将熊猫数据框存储到 Teradata 表中
【发布时间】:2019-06-05 20:53:54
【问题描述】:

我创建了一个 pandas 数据框“df”,并尝试使用 Teradata-SQL 助手将其存储在一个“表”中。

连接字符串 -

conn = pyodbc.connect(
         "DRIVER=Teradata;DBCNAME=tdprod;Authentication=LDAP;UID=" + username + ";PWD=" + password + ";QUIETMODE=YES",
        autocommit=True, unicode_results=True)

cursor = conn.cursor().execute(sql)

尝试使用:df.to_sql('table', con =conn)

这不起作用。

有没有更简单的方法将数据框存储到表中。

感谢任何帮助。

谢谢。

Traceback (most recent call last):

 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\engine\base.py", line 2158, in _wrap_pool_connect
return fn()
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 410, in connect
return _ConnectionFairy._checkout(self, self._threadconns)
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 788, in _checkout
fairy = _ConnectionRecord.checkout(pool)
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 529, in checkout
rec = pool._do_get()
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 1096, in _do_get
c = self._create_connection()
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 347, in _create_connection
return _ConnectionRecord(self)
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 474, in __init__
self.__connect(first_connect_check=True)
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\pool.py", line 671, in __connect
connection = pool._invoke_creator(self)
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\engine\strategies.py", line 106, in connect
 return dialect.connect(*cargs, **cparams)
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\sqlalchemy\engine\default.py", line 412, in connect
return self.dbapi.connect(*cargs, **cparams)
  File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\teradata\tdodbc.py", line 454, in __init__
checkStatus(rc, hDbc=self.hDbc, method="SQLDriverConnectW")
 File "C:\Users\tripata\PycharmProjects\NLP\venv\lib\site-packages\teradata\tdodbc.py", line 231, in checkStatus
raise DatabaseError(i[2], u"[{}] {}".format(i[0], msg), i[0])
teradata.api.DatabaseError: (8017, '[28000] [Teradata][ODBC Teradata Driver][Teradata Database] The UserId, Password or Account is invalid. , [Teradata][ODBC Teradata Driver][Teradata Database] The UserId, Password or Account is invalid. ')

【问题讨论】:

    标签: python dataframe teradata teradata-sql-assistant


    【解决方案1】:

    来自to_sql 的文档:

    Parameters
    ----------
    name : string
        Name of SQL table.
    con : sqlalchemy.engine.Engine or sqlite3.Connection
        Using SQLAlchemy makes it possible to use any DB supported by that
        library. Legacy support is provided for sqlite3.Connection objects.
    

    您可以看到您需要 sqlalchemy sqlite3,但不需要 pyodbc。

    您需要以下内容才能为 Teradata 创建引擎:

    from sqlalchemy import create_engine
    
    engine = create_engine(f'teradata://{username}:{password}@tdprod:22/')
    

    你会像这样使用它

    df.to_sql('table', engine)
    

    【讨论】:

    • 解决方案似乎没有运行。它抛出一条错误消息 - sqlalchemy.exc.DatabaseError: (teradata.api.DatabaseError) 。出于某种原因,它显示 UserId、Password 或 Account 无效。我交叉检查了我的帐户,它工作正常。
    • 你能用完整的堆栈跟踪更新这个问题吗?仅使用错误名称很难调试。
    • 用户名或密码好像错误。只需使用 sqlalchemy 连接字符串,直到它起作用。
    • 所以,我玩了一会儿,这似乎正在工作 - create_engine('teradata://' +user+':'+ password + '@'+host+':1025/'+' /'+'?authentication=LDAP')。我猜我们需要连接字符串中的主机名和身份验证。
    • 如何使用df.to_sql将datalab和表名相加?
    【解决方案2】:

    我已经进行了一些挖掘,这个解决方案可以快速完成工作 - 使用 python teradata 模块:

    import teradata
    import numpy as np
    import pandas as pd
    
    
    num_of_chunks = 100  #breaking the data into chunks is optional - use if you have many rows or would like to view status updates
    
    query = 'insert into SomeDB.SomeTeraDataTable'
    df = someDataframe
    
    #set host, user, password params
    host,username,password = 'hostName_or_IPaddress','username', 'password'
    
    #connet to DB using UdaExec
    udaExec = teradata.UdaExec (appName="IMC", version="1.0", logConsole=False)
    
    
    with udaExec.connect(method="odbc",system=host, username=username,
                                password=password, driver="Teradata") as connect:
    
    
        df_chunks = np.array_split(df, num_of_chunks)
    
        for i,_ in enumerate(df_chunks):
    
            data = [tuple(x) for x in df_chunks[i].to_records(index=False)]
    
            connect.executemany(query, data,batch=True)
    

    解决方案基于:this stackoverflow post

    【讨论】:

      【解决方案3】:

      create_engine('teradata://' +user+':'+ 密码 + '@'+host+':1025/'+'/'+'?authentication=LDAP') 将主机名和身份验证都添加到连接字符串对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-07
        • 2021-02-04
        • 2020-09-23
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        相关资源
        最近更新 更多