【问题标题】:User migration fails用户迁移失败
【发布时间】:2019-04-13 20:20:17
【问题描述】:

1) 我使用 ma​​ke:user 命令创建了用户类:

Console image

2) 我使用 ma​​ke:migration 命令生成了迁移文件。

3) 这是迁移文件中的 up() 函数:

    final class Version20181110133851 extends AbstractMigration
    {
         public function up(Schema $schema) : void
      {

       $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 
    'mysql', 'Migration can only be executed safely on \'mysql\'.');

    $this->addSql('ALTER TABLE user ADD email VARCHAR(180) NOT NULL, ADD roles JSON NOT NULL, CHANGE id id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id)');
    $this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D649E7927C74 ON user (email)');
       }
    ...
    }

4) 当我尝试使用 doctrine:migration:migrate 命令迁移到数据库时会发生这种情况

Image showing the error

这是错误的内容:

  -> ALTER TABLE user ADD email VARCHAR(180) NOT NULL, ADD roles JSON NOT 
  NULL, CHANGE id id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id)
  Migration 20181110133851 failed during Execution. Error An exception 
  occurred while executing 'ALTER TABLE user ADD email VARCHAR(180) NOT 
  NULL, ADD roles JSON NOT NULL, CHANGE id id INT AUTO_INCREMENT NOT NULL, 
  ADD PRIMARY KEY (id)':

  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, CHANGE id 
  id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id)' at line 1

  In AbstractMySQLDriver.php line 99:

  An exception occurred while executing 'ALTER TABLE user ADD email 
  VARCHAR(180) NOT NULL, ADD roles JSON NOT NULL, CHANGE id id INT 
  AUTO_INCREMENT NOT NULL, ADD PRI
  MARY KEY (id)':

 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, CHANGE id id INT 
 AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id)' at line 1


 In PDOConnection.php line 109:

 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, CHANGE id id INT 
 AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id)' at line 1


  In PDOConnection.php line 107:

  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, CHANGE id id INT 
  AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id)' at line 1

5) 我已经尝试解决它好几个小时了,但我还是个新手,我不认为我会自己解决它。

6) 我的问题:语法错误在哪里?

【问题讨论】:

  • 你的mysql版本是多少? JSON 字段仅适用于 5.7+
  • C:\xampp\mysql\bin>mysql --version mysql Ver 15.1 Distrib 10.1.36-MariaDB, for Win32 (AMD64)

标签: php symfony security doctrine


【解决方案1】:

正如@Padam87 所说,MariaDB 不支持原生 JSON 类型。如果由于某种原因无法升级数据库但又不想更改列类型,只需在 Doctrine 属性中定义数据库版本,让 Doctrine 为您处理转换。

doctrine.yaml:

doctrine:
    dbal:
        server_version: '10.1.36-MariaDB'

这将在表定义中添加注释,Doctrine 稍后将使用该注释对值进行编码/解码。

【讨论】:

    【解决方案2】:

    Mariadb 10.1 不支持原生 json 类型,因此您必须使用其他类型。更改您的列定义,删除此迁移,然后生成一个新迁移。

    或者,您可以升级。 Mariadb 从 10.2.7 及更高版本开始支持 json 类型。 https://mariadb.com/kb/en/library/json-data-type/

    【讨论】:

    • 是的,它有帮助。谢谢。尤文大道。
    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 2018-08-27
    • 2020-05-29
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多