【问题标题】:Symfony 4 Doctrine not working from console [2002] No such file or directorySymfony 4 Doctrine 不能从控制台工作 [2002] 没有这样的文件或目录
【发布时间】:2018-06-16 13:26:10
【问题描述】:

我正在使用 symfony 4,并且在运行学说控制台命令时出现此错误:

In AbstractMySQLDriver.php line 108:

An exception occurred in driver: SQLSTATE[HY000] [2002] No such file or directory  

我认为这是因为连接有问题,但是当我运行应用程序时,它可以毫无错误地访问数据库,所以我无法想象连接有什么问题。

我能够通过手动创建数据库并使用来继续工作

php bin/console doctrine:schema:create --dump-sql

但这确实是不需要的,因为稍后当需要更新架构时,所有数据都会丢失,因为我需要重新创建架构而不是更新它。

手动执行 SQL 后应用正常运行(easyadmin 运行正常)。

这是我的配置:

.ENV:

DATABASE_URL=mysql://root:root@127.0.0.1:3306/test

doctrine.yaml:

parameters:
     env(DATABASE_URL): ''

doctrine:
    dbal:
       driver: 'pdo_mysql'
       server_version: '5.7'
       charset: utf8mb4

我尝试了 drop 命令只是为了测试,它抛出了这个:

In DropDatabaseDoctrineCommand.php line 93:


Connection does not contain a 'path' or 'dbname' parameter and cannot be dropped.  

所以我将 dbname 添加到教义.yaml 并没有工作。 我也试过删除缓存,创建一个新项目,使用远程mysql,使用sqlite,但两种情况下的错误都是一样的!!

提前感谢您的帮助!

【问题讨论】:

  • 当我在参数中的教义.yaml 中添加数据库 url 时,我幸运地“解决了”它。但是在创建文件时,该行会被注释为“您不需要更改此值”。我认为这有点脏,但它确实有效。

标签: php symfony doctrine symfony4 symfony-flex


【解决方案1】:

所以我想你展示了你的教义.yml 的全部内容。

如果是这样,您可能需要考虑更改您的教义.yml,如下所示: 在 dbal: 部分中添加额外的一行

doctrine:
    dbal:
       driver: 'pdo_mysql'
       server_version: '5.7'
       charset: utf8mb4
       url: '%env(resolve:DATABASE_URL)%'

仔细观察最后一行,以 url: 开头。

'resolve:" 运算符在您的环境变量中查找 DATABASE_URL,如果找到,然后将表达式替换为其内容。

这是一个由 symfony 自动生成的学说.yml。

虽然可能不需要“解决”运算符。这也可能起作用:

doctrine:
    dbal:
       driver: 'pdo_mysql'
       server_version: '5.7'
       charset: utf8mb4
       url: '%env(DATABASE_URL)%'

这个方法是在the symfony docs中提出的,读起来可能很有趣,可以进一步了解symfony的配置。

【讨论】:

  • 确实不需要 resolve 操作符。但是错误一直在抛出,我一直在解决这个错误,似乎从控制台运行命令时没有加载 .env 变量,我认为这一定是问题所在。我不知道是否有一些文档显示 .env 在运行 bin/console 命令时是如何工作的。
【解决方案2】:

我的解决方法在这里:

export DATABASE_URL=<value from .env>

并且生成 SQL 是可行的 :)

【讨论】:

    【解决方案3】:

    config/packages/doctrine.yaml

    我解决了这个错误,在“config/packages/doctrine.yaml”文件的“parameters”>“env(DATABASE_URL)”字段中添加了我的数据库 url:

    parameters:
         # Adds a fallback DATABASE_URL if the env var is not set.
         # This allows you to run cache:warmup even if your
         # environment variables are not available yet.
         # You should not need to change this value.
         env(DATABASE_URL): 'mysql://your_db_url'
    

    【讨论】:

      【解决方案4】:

      我在 .env 文件中解决了这个变化

      DATABASE_URL=mysql://root:root@127.0.0.1:3306/test 
      

      DATABASE_URL="mysql://root:root@127.0.0.1:3306/test"
      

      我添加了引号。也许您正在使用Windows?它对我有用。

      点赞Symfony docs: Environment Variables

      【讨论】:

        【解决方案5】:

        请将DB_HOST=localhost改为DB_HOST=127.0.0.1

        > 教义/教义捆绑

        DATABASE_URL=mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
        

        【讨论】:

          【解决方案6】:

          嗨,我在 symfony 4 上添加了完全相同的行为, 我刚刚改了这个

          DATABASE_URL=mysql://root:root@localhost:8889/
          

          到这里

          DATABASE_URL=mysql://root:root@127.0.0.1:8889
          

          在我的 .env 或 .env.dev 文件上(取决于您正在处理的环境) 希望有帮助。

          【讨论】:

            猜你喜欢
            • 2010-12-13
            • 2016-10-21
            • 2015-02-23
            相关资源
            最近更新 更多