Проблема с вставкой записей через Python в таблицу Teradata - PullRequest
0 голосов
/ 07 июня 2018

У меня есть проект, в котором я ввожу имя таблицы Terdata DB в качестве параметра, выполняю инструкцию SQL, которая предоставляет агрегаты в таблице (min, max и т. Д.) Для каждого столбца, и возвращает эту информацию, где я затем помещаю ее вкадр данных.То, что я хотел бы сделать, это взять строки в кадре данных (1 строка на имя столбца в таблице) и вставить результаты в другую таблицу БД «Анализ данных», где результаты будут сохранены.

def main():
    def func_1(cfg_tbl):
        udaExec = teradata.UdaExec(appName="DataAnalysis", version="1.0", logConsole=False)
        main_query = """
        SELECT 'SELECT '''
        || TRIM(ColumnName)
        || ''', COUNT(DISTINCT "' || ColumnName || '") AS DISTINCT_COUNT,'
        || ' COUNT(1) - COUNT("' || ColumnName || '") AS NULL_COUNT,'
        || ' MAX("' || ColumnName || '") AS MAX_COL_VALUE,'
        || ' MIN("' || ColumnName || '") AS MIN_COL_VALUE,'
        || CASE WHEN ColumnType IN ('I', 'D', 'F', 'I1', 'I2', 'I8', 'N', 'DA', 'TS') THEN ' MAX(LENGTH(TO_CHAR("' || ColumnName || '")))'
                WHEN ColumnType IN ('CF', 'CV', 'CO') THEN ' MAX(LENGTH("' || ColumnName || '"))'
                ELSE NULL END || ' AS MAX_COLUMN_LENGTH,'
        || CASE WHEN ColumnType IN ('I', 'D', 'F', 'I1', 'I2', 'I8', 'N', 'DA', 'TS') THEN ' MIN(LENGTH(TO_CHAR("' || ColumnName || '")))'
                WHEN ColumnType IN ('CF', 'CV', 'CO') THEN ' MIN(LENGTH("' || ColumnName || '"))'
                ELSE NULL END || ' AS MIN_COLUMN_LENGTH,'
        || ' COUNT(1) AS TABLE_COUNT,'
        || ' ''%s_%s'' AS TABLE_NM,'
        || ' ''%s'' AS SOURCE_TYPE'
        || ' FROM ' || TRIM(DatabaseName) || '.' || TRIM(TableName) || ';' AS COL
        FROM DBC.ColumnsV A
        WHERE DatabaseName = 'XXX'
        AND TableName = '%s_%s'
        """ % (cfg_pre, cfg_tbl, cfg_src, cfg_pre, cfg_tbl)
        #  connect to Teradata, execute above sql and subsequent SELECT statements
        session = udaExec.connect(method="odbc", dsn="XXXX", username="XXX", password="XXX")
        pd.set_option('max_colwidth', 500)
        df = pd.read_sql(main_query, session)
        sql_execute = list(df.values.flatten())  
        col = ['COLUMN_NAME', 'DISTINCT_COUNT', 'NULL_COUNT', 'MAX_COL_VALUE', 'MIN_COL_VALUE',
        'MAX_COL_LENGTH', 'MIN_COL_LENGTH', 'TABLE_CNT', 'TABLE_NM', 'DATA_SOURCE']

        jdf = pd.DataFrame(columns=col)
        for script in sql_execute:
            jdf = pd.read_sql(script, session)
            print(jdf)
            session.execute("""INSERT INTO DATA_ANALYSIS(COLUMN_NM, DISTINCT_COUNT, NULL_COUNT, MAX_COL_VALUE, MIN_COL_VALUE,
                                            MAX_COL_LENGTH, MIN_COL_LENGTH, TABLE_CNT, TABLE_NM, DATA_SOURCE) 
                                            VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", (jdf[0], jdf[1], jdf[2], jdf[3], 
                                                                                     jdf[4], jdf[5], jdf[6], jdf[7], jdf[8], jdf[9]))

Проблема, с которой я сталкиваюсь, связана с кодом INSERT внизу.Я получаю KeyError: 0, я знаю, что должен что-то делать неправильно, когда я вставляю.Есть идеи?

Точная ошибка:

    Traceback (most recent call last):
  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 2442, in get_loc
    return self._engine.get_loc(key)
  File "pandas\_libs\index.pyx", line 132, in pandas._libs.index.IndexEngine.get_loc (pandas\_libs\index.c:5280)
  File "pandas\_libs\index.pyx", line 154, in pandas._libs.index.IndexEngine.get_loc (pandas\_libs\index.c:5126)
  File "pandas\_libs\hashtable_class_helper.pxi", line 1210, in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas\_libs\hashtable.c:20523)
  File "pandas\_libs\hashtable_class_helper.pxi", line 1218, in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas\_libs\hashtable.c:20477)
KeyError: 0
...