#python #csv #vertica #vertica-python
Вопрос:
Я пытаюсь скопировать данные из CSV в базу данных Vertica с COPY
помощью запроса, все данные копируются нормально, за исключением того, что если есть список или словарь, он копирует их в виде строки (т. е.: "{'k1': 'v1'}"
, "[1, 2, 3]"
). Поскольку для Vertica нет типа данных, подобного jsonb
(как в PostgreSQL), поэтому я должен принять его как long varchar
.
Формат файлов CSV.
"[1, 2, 3]","{"nested_prop_1": "nested_value_1", "nested_prop_2": "nested_value_2", "nested_prop_3": {"multi_nested_prop_1": "multi_value_1", "multi_nested_prop_2": "multi_value_2"}}","{"key_1": "value_1"}","{"key_1": "value_1"}",1
Примечание: Удаление двойных кавычек из приведенного выше списка и словаря не сработает, так как в конечном итоге они будут сохранены под типом данных varchar.
Копирование данных с помощью следующих:
...
copy_sql = ("COPY {table}({fields}) FROM LOCAL STDIN DELIMITER ',' ESCAPE AS '\' ENCLOSED BY '"'"
.format(table=temp_table, fields=', '.join(self.column_names())))
with open(file, "r") as fs:
cur.execute(copy_sql, copy_stdin=[fs], buffer_size=65536)
...
Как только курсор будет установлен в "dict"
so fetchall
, он вернется OrderedDict
>>> dict(cur.execute(f'SELECT * FROM {temp_table}').fetchall()[0])
{
'c_array': '[1, 2, 3]',
'c_nested_object': '{"nested_prop_1": "nested_value_1", "nested_prop_2": "nested_value_2",
"nested_prop_3": {"multi_nested_prop_1": "multi_value_1",
"multi_nested_prop_2": "multi_value_2"}}', 'c_object': '{"key_1": "value_1"}', 'c_object_with_props': '{"key_1": "value_1"}',
'c_pk': 1
}
Если это невозможно сделать в Vertica, то есть ли какой-либо обходной путь для того же самого?
Последнее, о чем я могу подумать, — это изменить возвращаемое значение fetchall
, хотя я думаю, что должен быть лучший способ. Не стесняйтесь также давать предложения и идеи.