Я создал таблицу со столбцом timestamp DATETIME и пытаюсь импортировать данные из файлов CSV, содержащих строки с метками времени Unix.

Однако, когда я пытаюсь использовать функцию импорта CSV DataGrip, я получаю ошибки типа

1:1: conversion failed: "1394669640" to datetime
2:1: conversion failed: "1394670060" to datetime
3:1: conversion failed: "1394670480" to datetime
4:1: conversion failed: "1394670780" to datetime

Возможно, dataGrip - не лучший инструмент, но это почти все, что я могу делать, учитывая, что у меня нет прямого доступа к машине, на которой работает сервер БД [*]. Очевидно, это сработает, если я установлю столбец как INT.

Есть ли способ настроить таблицу так, чтобы преобразование происходило автоматически?


[*] Да, но СУБД работает внутри контейнера Docker, поэтому, за исключением копирования файлов CSV на хосте, а затем внутри контейнера, я не могу играть трюки вроде LOAD DATA INFILE и устанавливать столбец с помощью { {X1}}.

1
Morpheu5 22 Дек 2017 в 20:56

1 ответ

Лучший ответ

Вы можете использовать LOAD DATA LOCAL INFILE для загрузки CSV-файла в удаленный MySQL (то есть внутри контейнера докеров) без необходимости копировать CSV-файл в контейнер.

mysql> create table MyTable (timestamp DATETIME PRIMARY KEY);

mysql> load data local infile 'data.csv' into table MyTable (@dummy) 
    SET timestamp = FROM_UNIXTIME(@dummy);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from MyTable;
+---------------------+
| timestamp           |
+---------------------+
| 2014-03-13 00:14:00 |
| 2014-03-13 00:21:00 |
| 2014-03-13 00:28:00 |
| 2014-03-13 00:33:00 |
+---------------------+

Обратите внимание, что параметр local-infile должен быть включен как на вашем сервере, чтобы разрешить удаленные клиенты, так и на клиенте. Чтобы выполнить приведенный выше пример, мне пришлось включить local-infile=1 на моем сервере /etc/my.cnf, а также я запустил клиент с опцией mysql --local-infile. Без обоих этих вариантов я получил очень запутанную ошибку:

ОШИБКА 1148 (42000): используемая команда недопустима в этой версии MySQL

Прочтите https://dev.mysql.com/doc /refman/5.7/en/load-data-local.html для получения дополнительной информации.

1
Bill Karwin 22 Дек 2017 в 18:47