Powstał mi dzisiaj problem - w autogenerowanej bazie nazwy kolumn miały spacje. Niestety mysql na to pozwala, choć nie zaleca ze względu na późniejsze problemy. I rzeczywiście - problemy pojawiają się w procesie współpracy z aplikacją.
Chciałem użyć Symfony z modułem Easy Admin. Problem w tym, że od wersji 4 Symfony nie pozwala już na mapowanie bazy do encji. Musiałem więc użyć starszej wersji - Symfony 3. I owszem - udało się. Jednak powstał kolejny problem. Easy Admin nie działa w tej wersji. Musiałem więc upgrade'ować Symfony. I owszem - udało się, ale tu z kolei pojawił się problem ze spacjami w nazwach pól encji, bo CRUD już wyrzucał błąd.
Z pomocą przychodzą procedury w MYSQL, jednak w wersji 8 już nie jest to tak łatwe, bo o ile starsze wersje pozwalały na pętle for na pobranych danych z SELECT, to teraz jest to już ograniczone. Po wielu próbach i kombinacjach udało się jednak tego dokonać i oto jak to wygląda:
DROP PROCEDURE IF EXISTS select_columns;
DELIMITER $$
CREATE PROCEDURE select_columns()
BEGIN
DECLARE t_schema varchar(50);
DECLARE t_name VARCHAR(150);
DECLARE t_column VARCHAR(150);
DECLARE t_new_column VARCHAR(150);
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_table CURSOR FOR SELECT table_schema,table_name,column_name FROM information_schema.columns WHERE locate(' ', column_name);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_table;
loop_through_rows: LOOP
FETCH cursor_table INTO t_schema,t_name,t_column;
IF done THEN
LEAVE loop_through_rows;
END IF;
SET t_new_column = replace(t_column, ' ', '_');
SET @query = concat('ALTER table `', t_schema, '`.`', t_name, ‚` rename column `', t_column, '` to `', t_new_column, '`');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cursor_table;
END;
$$
call select_columns();
Z pomocą przychodzą procedury w MYSQL, jednak w wersji 8 już nie jest to tak łatwe, bo o ile starsze wersje pozwalały na pętle for na pobranych danych z SELECT, to teraz jest to już ograniczone. Po wielu próbach i kombinacjach udało się jednak tego dokonać i oto jak to wygląda:
DROP PROCEDURE IF EXISTS select_columns;
DELIMITER $$
CREATE PROCEDURE select_columns()
BEGIN
DECLARE t_schema varchar(50);
DECLARE t_name VARCHAR(150);
DECLARE t_column VARCHAR(150);
DECLARE t_new_column VARCHAR(150);
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_table CURSOR FOR SELECT table_schema,table_name,column_name FROM information_schema.columns WHERE locate(' ', column_name);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_table;
loop_through_rows: LOOP
FETCH cursor_table INTO t_schema,t_name,t_column;
IF done THEN
LEAVE loop_through_rows;
END IF;
SET t_new_column = replace(t_column, ' ', '_');
SET @query = concat('ALTER table `', t_schema, '`.`', t_name, ‚` rename column `', t_column, '` to `', t_new_column, '`');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cursor_table;
END;
$$
call select_columns();
Brak komentarzy:
Prześlij komentarz
Zostaw ślad po sobie :)