wtorek, 5 marca 2024

Mysql 8 - grupowa zamiana spacji w nazach

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();

Brak komentarzy:

Prześlij komentarz

Zostaw ślad po sobie :)