Sqlalchemy Teradata ODBC 17.00 to_sql QVCI error CAST CLOB type to DATE

Я пытаюсь использовать pandas to_sql для существующей таблицы в базе данных Teradata, но у меня возникла эта ошибка QVCI. После некоторого исследования в Интернете я обновил драйвер ODBC до 17.00, но все равно получаю ту же ошибку.

Существующая таблица:

введите описание изображения здесь

Я использую sqlalchemy_teradata

Вот код: a_df.to_sql(name='TEST_LA_TEMP', con=engine, schema='DB', if_exists='replace', index=False)

Затем я попытался указать типы, но получил ту же ошибку.

from sqlalchemy.types import INTEGER, VARCHAR, Date

a_df.head()
a_df.to_sql(name='TEST_LA_TEMP', con=engine_ldap, schema='DB', if_exists='replace', index=False
            , dtype={'id': INTEGER,
                     'p_name': VARCHAR(20),
                     'dept': VARCHAR(20),
                     'update_date': Date})

ОШИБКА:

DatabaseError: (teradata.api.DatabaseError) (9719, '[HY000] [Teradata][ODBC Teradata Driver][Teradata Database](-9719)QVCI feature is disabled.')
[SQL: SELECT * 
FROM dbc.ColumnsQV 
WHERE DatabaseName (NOT CASESPECIFIC) = CAST(? as VARCHAR(128)) (NOT CASESPECIFIC) AND TableName=?]
[parameters: ('DB', 'TEST_LA_TEMP')]

Когда я использую тот же код для импорта в НОВУЮ (несуществующую) таблицу, он работает нормально, но возвращает CLOB как тип данных для большинства столбцов.

введите описание изображения здесь

Затем я попытался преобразовать CLOB типы в правильные типы, но он сказал, что CLOBs can only be converted to CHAR TO VARCHAR отсутствует мой update_date столбец.

Я могу заставить его работать, если вместо этого использую if_exists='append', а затем отбрасываю и снова создаю таблицу. но я все еще хочу понять, почему и как исправить эти ошибки.

Вопросов:

  1. Каков синтаксис для включения QVCI непосредственно для Teradata?
  2. Есть ли способ ПРИОБРЕСТИ CLOB на DATE? Как?
  3. Почему if_exists='replace' зависит от QVCI, а не if_exists='append'?

Спасибо!


person lvv    schedule 09.09.2020    source источник
comment
1) Не включайте QVCI, он не поддерживается, и текущие драйверы Teradata не будут ссылаться на него. Возможно, у вас установлены и старый, и новый драйвер, он все еще выбирает старый (например, вам может потребоваться явный драйвер = в строке подключения). Рассмотрите возможность использования teradatasqlalchemy против sqlalchemy_teradata плюс ODBC. 2) Вы можете выполнить CAST сначала на VARCHAR, а затем на DATE. 3) Для замены код, по-видимому, пытается сохранить существующие атрибуты столбца, чтобы он мог УДАЛИТЬ и повторно СОЗДАТЬ под обложками.   -  person Fred    schedule 09.09.2020
comment
В будущем, пожалуйста, ограничьте каждый вопрос SO одной проблемой. Для управления типами данных столбцов см. Аргумент dtype в документация для to_sql. А что касается вашего третьего вопроса, см. Соответствующий ответ здесь.   -  person Gord Thompson    schedule 09.09.2020
comment
Возможно, соединение все еще привязано к старому драйверу, как и сказал Фред. Проблема QVCI решена, начиная с версии 16.20. Я бы удалил DSN и воссоздал его, убедившись, что вы связали его с правильным драйвером. Кроме того, убедитесь, что вы делаете это на машине, на которой действительно выполняется ваш код. Если вы подключаетесь к БД с сервера приложений, ваш драйвер должен быть обновлен там, а не на клиентском компьютере.   -  person access_granted    schedule 11.09.2020