vertica-python Ошибка на COPY LOCAL - PullRequest
0 голосов
/ 27 июня 2018

Я использовал этот код для 'COPY LOCAL' в python на Vertica 7.1 :

conn_info = {'host': '192.168.1.1', 'port': 5433, 'user': 'dbadmin', 'password': 'xxxxxx', 'database': 'db'}
connection = vertica_python.connect(**conn_info)
cur = connection.cursor()
file_name="/tmp/tmp_file"
temp_file = open(file_name,"w")
temp_file .write(records)
temp_file.close()
os.system('gzip -cvf9 %s > %s.gz'%(file_name,file_name))
qr="copy tmp_table(int_id, int_timestamp, ... ) from local '%s' GZIP delimiter ';' RECORD TERMINATOR E'\\r' NULL  '\\N';"%(file_name+'.gz')
cur.execute(qr)

Но я хочу сделать то же самое на Vertica 9.0.1 сейчас, и я получил эту ошибку:

Traceback (последний вызов был последним):

Файл "collector_as.py", строка 264, в

cur.execute(qr)

Файл "/usr/local/lib/python2.7/dist-packages/vertica_python/vertica/cursor.py", строка 126, в исполнении

self.connection.process_message(self._message)

Файл "/usr/local/lib/python2.7/dist-packages/vertica_python/vertica/connection.py", строка 232, в process_message

raise errors.MessageError("Unhandled message: {0}".format(message))

MessageError: необработанное сообщение:

моя версия vertica-python:

pip freeze | grep vertica  -->  vertica-python==0.7.3

------------------------

Также я попробовал новый vertica-db-client из VERTICA (vertica-client-9.0.1-4.x86_64.tar.gz)
моя версия vertica-db-client:

pip freeze | grep vertica  -->  vertica-db-client==9.0.1.4

и я получил эту ошибку:

Traceback (последний вызов был последним):

Файл "collector_as.py", строка 265, в

cur.execute(qr)

NotSupportedError: COPY LOCAL не поддерживается

1 Ответ

0 голосов
/ 29 января 2019

При использовании vertica-python для выполнения команды COPY вы используете метод cur.copy(...).

Метод копирования курсора принимает два аргумента

  1. Команда копирования
  2. Файл для копирования

Кроме того, вместо FROM LOCAL вы используете FROM STDIN.

qr="copy tmp_table(int_id, int_timestamp, ... ) from STDIN GZIP delimiter ';' RECORD TERMINATOR E'\\r' NULL  '\\N';"
cur.copy(qr, file_name+'.gz')

Если бы вы использовали vsql - например, - тогда ваш синтаксис с использованием FROM LOCAL был бы правильным, но vertica-python в основном берет файл, заданный в качестве второго аргумента, и передает его в команду копирования как STDIN.

...