1

Тема: Просторові дані в mysql

Привіт усім!

В мене є mysql база (не моя) для збереження просторових даних, поля координат в кількох таблицях. Мені потрібно цю базу перегнати в postgresql з Django.
І перша проблема з якою стикаюсь, я не можу локально розгорнути цю базу, щоб конектитись з django до неї.

Зробив дамп як звично через mysqldump, завантажив локально. Створив базу з кодуванням UTF-8, а при імпорті помилка

at line 400: Cannot get geometry object from data you send to the GEOMETRY field

на 400 рядку

 INSERT INTO `photos` VALUES  

А наступне значення, після того що було проімпортовано останнім:

(3331,NULL,NULL,'DSC05290.JPG','',5516,'2010-07-24 10:13:38',0,0,'');

Поле координат стоїть 5, тож помилка на пустому рядку

''

Куди копати? може там базу для картографічних даних треба по іншому створювати?

Подякували: 221VOLT1

2

Re: Просторові дані в mysql

А структуру таблиці ми як маємо побачити? Телепатично?

Подякували: A.N.Onim1

3 Востаннє редагувалося Q-bart (19.02.2017 15:23:02)

Re: Просторові дані в mysql

Блін, точно, забув)

--
-- Table structure for table `photos`
--

DROP TABLE IF EXISTS `photos`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `photos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL COMMENT 'Название фото',
  `description` text,
  `filename` varchar(255) NOT NULL,
  `coords` point NOT NULL,
  `user_id` int(11) NOT NULL DEFAULT '-1' COMMENT 'Идентификатор пользователя на форуме',
  `date_add` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gallery` int(1) NOT NULL,
  `report_id` int(11) NOT NULL,
  `report_field_name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=11749 DEFAULT CHARSET=utf8 COMMENT='Фотографии';
/*!40101 SET character_set_client = @saved_cs_client */;

--

4

Re: Просторові дані в mysql

Значення '' іде в `coords` point NOT NULL. Я б це теж не зрозумів.
Якщо стара база MySQL ще доступна - можете глянути, що там насправді в цьому рядку?

5

Re: Просторові дані в mysql

Я також раджу викинути опції NOT NULL.
Або перевірити як потрапило пусте значення до дампу

Подякували: koala, Torbins2

6 Востаннє редагувалося Q-bart (19.02.2017 21:34:36)

Re: Просторові дані в mysql

Отакі дані:

\0\0\0\0\0\0\0d;??\'>@??4I@

Це з бекапу .sql:

INSERT INTO `photos` VALUES (1,'Финал','7a5f8c43eb306707283786716d9cd4881215305210.jpg','\0\0\0\0\0\0\0d;??\'>@??4I@',2,'2009-03-14 07:55:35',1,0,'');

Якщо в існуючій базі спробувати вивести через:

SELECT X(coords) FROM photos;

То виводить отак:

+-----------+
| X(coords) |
+-----------+
|   30.1545 |
|   28.9708 |
|   28.9728 |
|   28.9749 |
|   29.0489 |
|   29.4805 |
|   29.4772 |
|   29.4477 |
|   31.5527 |
|   31.5325 |
|   30.4957 |
|   30.4944 |
|   30.2246 |
|   29.0933 |

Забирав NOT NULL, не допомогло

7

Re: Просторові дані в mysql

Судячи з усього дані яки потрапили у базу не відповідають потрібному формату.

8 Востаннє редагувалося Q-bart (21.02.2017 19:26:27)

Re: Просторові дані в mysql

Так. Виходить я їх невірно експортую. Як мені правильно це зробити, щоб зберегти POINT поля при імпорті?

9

Re: Просторові дані в mysql

Може це допоможе - https://dev.mysql.com/doc/workbench/en/ … pping.html

Подякували: 221VOLT1

10

Re: Просторові дані в mysql

@varkon На жаль, не знаю чим.

Ось нарив таку інфо. Здається, це не в мене першого таке. Бага існую в mysqldump https://bugs.mysql.com/bug.php?id=43544

Подякували: 221VOLT1

11

Re: Просторові дані в mysql

https://en.wikibooks.org/wiki/Convertin … PostgreSQL

ймовірно це допоможе

12

Re: Просторові дані в mysql

З цим частково вирішив. Зараз така проблема:

Напр. запит на всі записи:

SELECT *  FROM places;

Але проблема в тому що в таблиці, є поле coords - координати. І мені з попереднім запитом його повертає у вигляді юнікоду, (чи що це карбркадабра), а мені треба його діставати з функцією

AsText(coords) 

.
Тобто це запит:

SELECT AsText(coords)  FROM places;

повертає те, що треба, але мені потрібні всі запити разом...

Гугління не допомогло. Можливо це дуже просто, але сам я ще про sql не надто знаю) Треба сідати вчити якось)

13

Re: Просторові дані в mysql

Якщо швидкість написання важливіша за оптимальність по швидкості і пам'яті - то

SELECT *, AsText(coords) AS p_coords FROM places;

а після імпорту в posgresql

ALTER TABLE places DROP COLUMN coords;
ALTER TABLE places RENAME COLUMN p_coords TO coords;

звісно, якщо це ключ чи індексоване поле - буде скрутніше.

Подякували: Q-bart, 221VOLT2

14

Re: Просторові дані в mysql

Чомусь мені здається (із опиту праці з Ораклом та Информиксом) що мігрувати треба дещо хардкорніше.

  • Сформувати метадані, та створити структуру бази.

  • Вивантажити кожну таблицю окремо у формат який відомий двом СКБД. Наприклад CSV чи то DBF...

  • Завантажити кожне вівантажене окремо.

Щось мені підказує, що дамп тут не дуже надійний помічник.

15

Re: Просторові дані в mysql

Vi написав:

Чомусь мені здається (із опиту праці з Ораклом та Информиксом) що мігрувати треба дещо хардкорніше.

  • Сформувати метадані, та створити структуру бази.

  • Вивантажити кожну таблицю окремо у формат який відомий двом СКБД. Наприклад CSV чи то DBF...

  • Завантажити кожне вівантажене окремо.

Щось мені підказує, що дамп тут не дуже надійний помічник.

Це була перша ідея така. Не пішло, так як бази не є ідентичними за структурою, відрізняючись тільки в СУБД. Зараз це робимо через інтерфейс django, з її managmant commands, за схемою: запит в стару базу на отримання даних -> запит в нову(через django ORM на запис даних)

16

Re: Просторові дані в mysql

koala написав:

Якщо швидкість написання важливіша за оптимальність по швидкості і пам'яті - то

SELECT *, AsText(coords) AS p_coords FROM places;

а після імпорту в posgresql

ALTER TABLE places DROP COLUMN coords;
ALTER TABLE places RENAME COLUMN p_coords TO coords;

звісно, якщо це ключ чи індексоване поле - буде скрутніше.

Саме той варіант коли особлива швидкість.
Дякую, ви мене так багато виручали  *THUMBSUP*

17

Re: Просторові дані в mysql

Ну загалом, якось так вийшло, пишу сюди далі.
поясніть мені швиденько такий запит:

SELECT 
s.rating / 100 rating,
..

Беремо поле rating з таблички, ділимо на 100 і ...? Що це за ще один rating? Там нема ні множення, ні ділення...

18

Re: Просторові дані в mysql

Q-bart написав:

Ну загалом, якось так вийшло, пишу сюди далі.
поясніть мені швиденько такий запит:

SELECT 
s.rating / 100 rating,
..

Беремо поле rating з таблички, ділимо на 100 і ...? Що це за ще один rating? Там нема ні множення, ні ділення...

То такий аліас. Це теж саме, що і це

SELECT 
(s.rating / 100) as rating,
..
Подякували: Q-bart, 221VOLT2

19

Re: Просторові дані в mysql

Q-bart написав:
at line 400: Cannot get geometry object from data you send to the GEOMETRY field

на 400 рядку

 INSERT INTO `photos` VALUES  

А наступне значення, після того що було проімпортовано останнім:

(3331,NULL,NULL,'DSC05290.JPG','',5516,'2010-07-24 10:13:38',0,0,'');

Поле координат стоїть 5, тож помилка на пустому рядку

''

...

На скільки я зрозумів, то ви вставляєте дані в поле GEOMETRY, яке ви не показали у структурі таблиці photos.

Подякували: 221VOLT1

20

Re: Просторові дані в mysql

http://memesmix.net/media/created/250/116v8h.jpg

manage.py dumpdata -> manage.py loaddata

:D

Подякували: 221VOLT1