Заставить команду миграции доктрины Symfony использовать LONGTEXT для типа поля json вместо JSON при сопоставлении с MySQL

Я использую Symfony 4 с базой данных MySQL (5.5.57-0ubuntu0.14.04.1), которая не поддерживает тип JSON.

Когда я сопоставляю поле с «json» с помощью файла конфигурации Doctrine yml, файл миграции, сгенерированный doctrine:migrations:diff, использует тип JSON MySQL вместо LONGTEXT, и при попытке запустить миграцию возникает ошибка.

И каждый раз, когда выполняется перенос миграции, мне приходится вручную менять JSON на LONGTEXT для последних изменений и удалять изменения в JSON в результате более старых изменений.

Легко ошибиться, если в одной из этих миграций вы забудете удалить «ALTER TABLE CHANGE somefield JSON».

На данный момент мое решение - добавить в конфигурационный файл doctrine.yml следующее:

doctrine:
    dbal:
      mapping_types:
           longtext: json

Это делает некоторые странные, но легко отслеживаемые и удаляемые, изменения, когда я запускаю doctrine:migrations:diff -v, например, изменение на LONGTEXT некоторых полей, которые уже были LONGTEXT. Я не знаю почему, и в конце концов я должен это исправить.

Но, по крайней мере, я мог бы помешать доктрине изменить мой длинный текст на тип данных MySQL json, который отображается как тип данных json доктрины.

Кто-нибудь сталкивался с этой проблемой?

Спасибо!

Я не являюсь пользователем Doctrine, но похоже, что вы должны сопоставить поле с «текстом», а не с «json». Это именно то, что вы делаете, если не можете использовать тип данных JSON. Если вы храните JSON в LONGTEXT, MySQL не будет проверять, что вы храните правильно отформатированный JSON. Это просто текст, который по совпадению может быть JSON, но вы также можете сохранить любой другой текст в этом поле. Так что это просто текст. Объявите это как текст.

Bill Karwin 03.12.2018 16:38

Я понимаю, зачем использовать json, если вы не можете проверить его, используя настоящий JSON в базе данных ??? и я думаю, ты прав. Но я бы хотел настроить эту функцию для разных серверов, например, в doctrine_prod.yml, если это возможно ... но да, вы правы. Doctrine решила не «лгать» разработчикам, если вы говорите, что доктрина json будет использовать json, поскольку он существует в MySQL, если он не поддерживается текущей версией, это ваша проблема. Спасибо за совет ;-)

Victor Salvans Montesó 03.12.2018 16:50

Верно, я полагаю, что вам не следует использовать отображение json в Doctrine, если вы используете старую версию MySQL, которая не поддерживает этот тип данных.

Bill Karwin 03.12.2018 16:55
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
3
1 244
2

Ответы 2

Я был неправ, используя таким образом конфигурацию "mapping_types". В этом нет смысла. Решение Это еще проще, и я не осознавал, что существует следующий параметр:

server_version

Просто добавьте версию сервера в конфигурацию dbal следующим образом:

doctrine:
    dbal:
        driver: 'pdo_mysql'
        server_version: '5.5.57'
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
ПРИМЕЧАНИЕ для пользователей MariaDB: не запутайтесь при настройке server_version. - В НЕТ должна быть указана версия MySql (например, 5.5.57), а в ДОЛЖЕН должна быть указана версия MariaDB (например, mariadb-10.2.27). В противном случае вы получите скрытые проблемы с DBAL (например, неправильно сгенерированные миграции), даже если все работает и ошибок нет.
Kamafeather 20.11.2019 11:58

Для меня у меня была та же проблема, и решение заключалось в том, чтобы войти в созданную миграцию (например, Version20190306110143.php) и изменить dataType «JSON» на «LONGTEXT» !!

На самом деле, у меня это сработало, но, честно говоря, я не знаю, не вызовет ли это проблем со временем. В любом случае, если это произойдет, я отправлю их

Благодарность

Другие вопросы по теме