MySQL / MariaDB не принимает формат JSON? Не могу создать базу данных
В настоящее время я использую XAMPP/Apache с MariaDB на phpmyadmin. Я пытаюсь создать таблицу на основе моего кода, используя Doctrine и, следовательно, аннотации для проверки формы. Я просто хочу сохранить введенные значения из формы в базе данных. В другом примере это работало отлично.
Но теперь у меня есть "поле флажка", которое, как мне кажется, вызывает какие-то проблемы при создании базы данных.
Я использую эти команды в консоли:
php bin/console make:migration
После этого:
php bin/console doctrine:migrations:migrate
При вызове 2nd = когда я пытаюсь создать таблицу в моей базе данных, я получаю следующие ошибки:
Migration 20181121103017 failed during Execution.
Error An exception occurred while executing 'CREATE TABLE pizza (id INT
AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL
phone VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL,
size INT NOT NULL, ingredient JSON NOT NULL COMMENT '(DC2Type:json_array)', delivery INT NOT NULL,
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB':
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
your SQL syntax; check the manual that
corresponds to your MariaDB server version for the right syntax to use near
'JSON NOT NULL COMMENT '(DC2Type:json_
array)', delivery INT NOT NULL, PRIMARY KEY' at line 1
Я действительно не знаю, что я делаю неправильно в этот момент.
Это мои аннотации в моем файле "Pizza.php".
// ------------------
/**
* @Assert\NotBlank(
* message = "E-Mail Address required"
* )
* @Assert\Email(
* message = "The email '{{ value }}' is not a valid email."
* )
* @Assert\Length(min="2", max="255")
* @ORM\Column(type="string", length=255)
*/
protected $email;
// ------------------
/**
* @Assert\Range(min=0, max=3)
* @ORM\Column(type="integer")
*/
protected $size;
// ------------------
/**
*@Assert\NotBlank(
* message = "Choose at least 1 ingredient!"
* )
* @ORM\Column(type="array")
*/
protected $ingredient;
// ------------------
/**
* @Assert\NotBlank(
* message = "Choose a delivery option!"
* )
* @Assert\Range(min=0, max=1)
* @ORM\Column(type="integer")
*/
protected $delivery;
Сама форма работает отлично, валидации работают так, как я планировал.
Что именно я делаю не так?
Если вам нужен еще какой-нибудь код из моего "Pizza.php" (Entity Class) или моего файла контроллеров, где я делал свою маршрутизацию, пожалуйста, дайте мне знать.
Я благодарен за любую помощь!
1 ответ
Судя по вашим комментариям, похоже, что Doctrine считает, что может использовать функции, недоступные в вашей версии mariadb.
Если вы сообщите доктрине, какую версию вы используете, она выберет правильный тип данных для этого столбца, в этом случае, вероятно, LONGTEXT
или что-то подобное.
В зависимости от того, что вы используете, это будет выглядеть примерно так (например, используя файл yaml в Symfony):
doctrine:
dbal:
server_version: '10.1'
Обратите внимание, что вам нужно будет заново сгенерировать ваши миграции.
Как я уже упоминал в своем комментарии, лично я нормализовал бы базу данных и использовал бы другую таблицу, чтобы связать пиццу с ингредиентами, чтобы упростить поиск и фильтрацию.
Была такая же проблема, и я нашел это обходное решение:
В Doctrine.yaml
обнаружил, что server_version был выше моей версии MariaDB, поэтому я исправил это в этой строке:
doctrine:
dbal:
server_version: '5.5'
Я не работал, пока вручную не стер уже выполненные миграции. Вы можете найти их вsrc/Migrations
.
Затем снова запустите:
php bin/console make:migration
php bin/console doctrine:migrations:migrate
И это сделало работу, надеюсь, это поможет.
Сначала проверьте свою версию mariadb. Версия 10.1 не поддерживает тип данных JSON, а поддержка версии 10.2 является неполной.
Обходной путь к версии в файле doctrine.yaml к
server_version: '5.6'
затем регенерируйте геттеры и сеттеры с
php bin/console make:entity --regenerate
затем сгенерируйте файл миграции с
php bin/console make:migration
это сгенерирует файл миграции с типом данных LONGTEXT.
Затем в src/Migrations откройте каждый файл и проверьте наличие любого файла миграции с JSON как тип данных и удалите всю миграцию с таким типом данных. Помните, что если вы не удалите эти файлы, следующая команда повторяется, каждый файл сохраняет их в базе данных один за другим, начиная со старого. Если такой файл существует, он снова вызовет ошибку.
Наконец, беги
php bin/console doctrine:migrations:migrate
который сохранит все миграции в базу данных соответственно.