Symfony2 无法连接到 sqlite

Posted

技术标签:

【中文标题】Symfony2 无法连接到 sqlite【英文标题】:Symfony2 cannot connect to sqlite 【发布时间】:2017-08-20 00:22:43 【问题描述】:

我试图在 symfony2 的 behat 测试中使用 sqlite 基础。就我而言,symfony2 中的 behat 找到了我的基础,并可以在其中创建固定装置。问题是我的测试站点无法连接到这个基地。

这是我的config_test.yml

doctrine:
    dbal:
        driver:   pdo_sqlite
        host:     127.0.0.1
        dbname:   "%database_name%_test"
        path:     tests/eg_test.db

这是我的config.yml

doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8

这是我的behat.yml

default:
    suites:
        default:
            paths:
                features: '%paths.base%/features'
                bootstrap:  '%paths.base%/features/bootstrap'
            contexts:
                - FeatureContext: ~
                - EwidencjaContext:
                    userManager: '@fos_user.user_manager'
                    em: '@doctrine.orm.entity_manager'
                    packageManager: '@em.package_manager'
    extensions:
        Behat\Symfony2Extension: ~
        Behat\MinkExtension:
            base_url:  http://nginx/app_test.php
            goutte: ~
            selenium2:
                browser: "chrome"
                wd_host: http://selenium_chrome:4444/wd/hub
                capabilities:  "browserName": "chrome", "browser": "chrome"
        Bex\Behat\ScreenshotExtension:
            image_drivers:
                local:
                    screenshot_directory: tests/features/images/
                    clear_screenshot_directory: true

这是我在尝试登录我的网站后返回的日志。用户是否存在无关紧要。所以这不是密码错误或类似的错误。似乎站点只是没有连接到基地。

[2017-03-27 10:22:09] request.INFO:匹配路由“fos_user_security_check”。 "route":"fos_user_security_check","route_parameters":"_controller":"FOS\UserBundle\Controller\SecurityController::checkAction","_route":"fos_user_security_check","request_uri":"http://localhost/app_test.php/login_check", “方法”:“POST” [] [2017-03-27 10:22:10] security.INFO:身份验证请求失败。 "exception":"[object] (Symfony\Component\Security\Core\Exception\AuthenticationServiceException(code: 0): 驱动程序发生异常:SQLSTATE[HY000] [14] 无法在 /var/www 打开数据库文件/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php:94,Doctrine\DBAL\Exception\ConnectionException(代码:0):驱动程序中发生异常:SQLSTATE [HY000] [14] 无法在 /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractSQLiteDriver.php:82 打开数据库文件,Doctrine\DBAL\Driver\PDOException(code: 14): SQLSTATE[HY000 ] [14] 无法在 /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:47 打开数据库文件,PDOException(code: 14): SQLSTATE[HY000] [14] 无法在 /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:43)" [] 打开数据库文件 [2017-03-27 10:22:10] security.DEBUG:身份验证失败,触发重定向。 "failure_path":"/login" [] [2017-03-27 10:22:10] request.INFO:匹配路由“fos_user_security_login”。 "route":"fos_user_security_login","route_parameters":"_controller":"FOS\UserBundle\Controller\SecurityController::loginAction","_route":"fos_user_security_login","request_uri":"http://localhost/app_test.php/login", “方法”:“获取” [] [2017-03-27 10:22:10] security.INFO:使用匿名令牌填充 TokenStorage。 [] []

这是我尝试从浏览器登录时在我的网站上遇到的错误:

由于系统问题,无法处理身份验证请求。

当我尝试注册新用户时出错:

驱动发生异常:SQLSTATE[HY000] [14] 无法打开数据库文件

我创建了我的 sqlite 数据库,该数据库接近标准的 mysql base im 使用在 prod 上。之后我使用了bin/console doctrine:schema:update --force --env=test。我的数据库获得了良好的文件 mod (-rwxrwxr-x) 并被正确的用户和组使用。

【问题讨论】:

【参考方案1】:

将您的 config_test.yml 更改为:

doctrine:
    dbal:
        connections:
            default:
                driver: pdo_sqlite
                path: %kernel.cache_dir%/default.db
                charset: UTF8

然后授予正确的权限,显示在此处:Setting up or Fixing File Permissions 根据您的操作系统,您将在第 2 次或第 3 次运行命令。

【讨论】:

这很好用!谢谢。我只是不明白一件事。这个 default.db 是自动生成的。由于它在缓存目录中,如果不清除缓存,它将丢失它。我如何告诉它用我的桌子和固定装置生成基础? 好的,我找到了从图像中重置数据库的代码。 /** *@ BeforeScenario * * @Given the database is clean */ public function theDatabaseIsClean() exec('php app/console cache:clear --env=test'); exec('php app/console doctrine:database:create --env=test --force'); exec('php app/console doctrine:schema:update --env=test --force'); exec('cp tests/features/database/eg_test.db var/cache/test/default.db'); 您可以使用 Symfony+Behat 的方式来完成,如下所示:Loading doctrine data fixtures before each behat scenarios within feature context file of symfony【参考方案2】:

如果您转到您的 parameters.yml 文件,您应该会看到路径,如下所示:database_path: '%kernel.project_dir%/var/data/data.sqlite',另一个建议:在 /var 中创建一个目录并将您的 data.sqlite 文件放入其中

希望对你有帮助:)

【讨论】:

以上是关于Symfony2 无法连接到 sqlite的主要内容,如果未能解决你的问题,请参考以下文章

无法在 React-Native 中连接到 SQLite

Laravel 在测试时无法连接到 sqlite 并使用开发 postgresql 设置

Nx Monorepo NestJS TypeORM SQLite:无法连接到数据库

启动新的 Sequelize 后端并且无法连接到 SQLite DB

Django 多个数据库 - 无法连接到 mysql 服务器回退到 sqlite

AttributeError:使用flask-sqlalchemy连接到sqlite数据库时无法设置属性