Неверная дата при вставке в Teradata с использованием Python - PullRequest
0 голосов
/ 08 октября 2018

Я работаю над куском Python, который вставит фрейм данных в таблицу teradata, используя pyodbc.Ошибка, которую я не могу исправить: ...

File "file.py", line 33, in <module>
cursor.execute("INSERT INTO DB.TABLE (MASDIV,TRXTYPE,STATION,TUNING_EVNT_START_DT,DOW,MOY,TRANSACTIONS)VALUESrow['MASDIV'],'trx_chtr',row['STATION'],row['TUNING_EVNT_START_DT'],row['DOW'],row['MOY'],row['TRANSACTIONS'])
pyodbc.DataError: ('22008', '[22008] [Teradata][ODBC Teradata Driver][TeradataDatabase] Invalid date supplied for Table.TUNING_EVNT_START_DT. (-2666) (SQLExecDirectW)')

Чтобы заполнить вас ... У меня есть таблица Teradata, в которую я хочу взять фрейм данных и вставить его в.Эта таблица сделана как.

CREATE SET TABLE  DB.TABLE, FALLBACK
   (PK decimal(10,0) NOT NULL GENERATED ALWAYS AS IDENTITY
            (START WITH 1 
            INCREMENT BY 1 
            MINVALUE 1 
            --MAXVALUE 2147483647 
            NO CYCLE),
    TRXTYPE VARCHAR(10),
    MASDIV VARCHAR(30),
    STATION VARCHAR(50),
    TUNING_EVNT_START_DT DATE format 'MM/DD/YYYY',
    DOW VARCHAR(3),
    MOY VARCHAR(10),
    TRANSACTIONS INT,
    ANOMALY_FLAG INT NOT NULL DEFAULT 1)
PRIMARY INDEX (PK);

Первичный ключ и anomaly_flag будут автоматически заполнены. Ниже приведен скрипт, который я использую и сталкиваюсь с ошибкой.Это чтение в CSV и создание кадра данных.Первые две строки (включая заголовок) CSV выглядят как ...

MASDIV              | STATION                    | TUNING_EVNT_START_DT | DOW |    MOY    | TRANSACTIONS

Staten Island       | WFUTDT4                    |         9/12/18      | Wed | September | 538

San Fernando Valley | American Heroes Channel HD |        6/28/2018     | Thu | June      | 12382

Вот сценарий, который я использую ...

 '''
Written by Bobby October 1st, 2018
REFERENCE
https://tomaztsql.wordpkress.com/2018/07/15/using-python-pandas-dataframe-to-read-and-insert-data-to-microsoft-sql-server/
'''

import pandas as pd
import pyodbc
from datetime import datetime

#READ IN CSV TEST DATA
df = pd.read_csv('Data\\test_set.csv')
print('CSV LOADED')

#ADJUST DATE FORMAT
df['TUNING_EVNT_START_DT'] = pd.to_datetime(df.TUNING_EVNT_START_DT)
#df['TUNING_EVNT_START_DT'] = 
df['TUNING_EVNT_START_DT'].dt.strftime('%m/%d/%Y')
df['TUNING_EVNT_START_DT'] = df['TUNING_EVNT_START_DT'].dt.strftime('%Y-%m-%d')
print('DATE FORMAT CHANGED')
print(df)

#PUSH TO DATABASE
conn = pyodbc.connect('dsn=ConnectR')
cursor = conn.cursor()

# Database table has columns...
# PK | TRXYPE | MASDIV | STATION | TUNING_EVNT_START_DT | DOW | MOY | 
TRANSACTIONS | ANOMALY_FLAG
# PK is autoincrementing, TRXTYPE needs to be specified on insert command, 
and ANOMALY_FLAG defaults to 1 for yes

for index, row in df.iterrows():
        cursor.execute("INSERT INTO DLABBUAnalytics_Lab.Anomaly_Detection_SuperSet(MASDIV,TRXTYPE,STATION,TUNING_EVNT_START_DT,DOW,MOY,TRANSACTIONS)VALUES(?,?,?,?,?,?,?)", row['MASDIV'],'trx_chtr',row['STATION'],row['TUNING_EVNT_START_DT'],row['DOW'],row['MOY'],row['TRANSACTIONS'])
    conn.commit()
    print('RECORD ENTERED')

print('DF SUCCESSFULLY WRITTEN TO DB')

#PULL FROM DATABASE
sql_conn = pyodbc.connect('dsn=ConnectR')
query = 'SELECT * FROM DLABBUAnalytics_Lab.Anomaly_Detection_SuperSet;'
df = pd.read_sql(query, sql_conn)
print(df)

Так что в этом яЯ конвертирую формат даты и пытаюсь вставить строку за строкой в ​​таблицу Teradata.Первая запись читает и находится в базе данных.Вторая запись выдает ошибку, которая находится вверху.Дата - 28.06.18, и я изменил ее на 6.11.18, чтобы посмотреть, не было ли смешения с днем ​​и месяцем, но с той же проблемой.Колонки где-то сбиваются, и он пытается вставить значение другого столбца в столбец даты.

Любые идеи или помощь приветствуются!

1 Ответ

0 голосов
/ 09 октября 2018

Итак, вопрос был в формате таблицы.Первоначально он создавался так, чтобы иметь формат MM / DD / YYYY из CSV, но при изменении его на формат YYYY-MM-DD скрипт работал идеально.

Спасибо!

...