5

所以我整个上午都在摆弄 Symfony2 并阅读主要文档或至少一半。我被困在与数据库相关的任何事情上。

我的简单问题是:我们是否事先制作数据库结构?

文档说创建实体类,然后使用 database:create 在 CLI 上生成数据库表。我跟着做了一个带有orm注解的博客实体类。

运行命令:

php app/console doctrine:database:create

Warning: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock) in /Applications/MAMP/htdocs/flairbagSy2/vendor/doctrine-dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php on line 36
Could not create database for connection named blog
SQLSTATE[HY000] [2002] No such file or directory

我认为这与 mysql 套接字文件的位置有关,但我不知道如何在 Symfony2 的配置中更改套接字文件的路径。

如果有人能指出我在哪里更改套接字文件的路径。

我曾经在 CakePHP 上遇到过类似的问题,简单的解决方法是在 db 连接数组中添加一个端口键:

var $default = array(
    'driver' => 'mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'root',
    'password' => 'root',
    'database' => 'cake',
    'port' => '/Applications/MAMP/tmp/mysql/mysql.sock',
);

我如何在 Symfony2 中做到这一点。

4

3 回答 3

8

学说:数据库:创建命令不会填充表的结构,而是在您的数据库管理器(如 MySQL)上创建数据库。要填充数据库结构,请使用doctrine:schema:create用于初始创建结构的doctrine:schema:update --force命令以及在对注释进行一些修改后想要更新结构时使用该命令。

正如您所提到的,您需要在 Symfony2 中配置一些参数才能使 Doctrine 正常工作。这些参数需要在 config.yml 配置文件中设置,您可以在标准 Symfony2 发行版的 app/config 文件夹中找到该文件。这是您需要添加到 config.yml 文件的配置示例:

# Doctrine Services Configuration
doctrine:
  dbal:
    default_connection: default
    connections:
      default:
        driver:   pdo_mysql
        host:     localhost
        port:     3396
        dbname:   dbname_dev
        user:     dbname_dev
        password: yourpassword
        logging:  "%kernel.debug%"

  orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    default_entity_manager: default
    entity_managers:
      default:
        mappings:
          AcmeBundle: ~

配置的第一部分,dbal 部分,用于配置您的数据库连接信息。我建议您首先测试与数据库的 root 帐户的连接,然后当一切正常时,更改设置以使用专用用户。这样,您可以确定您没有某些权限问题或其他可能与专用用户相关的问题。

第二部分,orm 部分,用于配置实体到数据库的映射。如果您希望 Symfony2 自动填充数据库结构,这部分是必需的。将 AcmeBundle 替换为上面示例中的包的名称,以启用项目中的 orm 功能。

另一方面,Symfony2 团队正在努力简化配置,我认为现在有一种更简单的方法来配置 Doctrine 参数。我建议您的示例是我现在正在使用 Symfony2 的 Beta1 的示例。

最后回答你的问题,我认为最好是让 Symfony2 处理创建和更新数据库结构。支持这一点的一个论点是您不需要维护处理数据库结构的 SQL 文件。此信息由实体中的注释隐式保存,因此您只需更改注释并调用doctrine:schema:update --force命令来更新结构。考虑到这一点,您不应该事先创建结构,而是让 Symfony2 为您创建它。

这是测试一切正常的工作流程:

  1. 更新您的 config.yml(在 app/config 中)以包含 Doctrine 配置参数
  2. 打开提示并转到 Symfony 发行版的根文件夹(您可以在其中看到 app、src、vendor 和 web 文件夹)
  3. 运行php app/console doctrine:database:create以在 MySQL 中创建数据库
  4. 运行php app/console doctrine:schema:create创建数据库结构
  5. 在 MySQL 中检查数据库和结构是否已正确创建

希望这有帮助。

问候,
马特

于 2011-05-02T06:58:54.780 回答
5

最初的问题询问如何在 Symfony2 配置中定义非标准套接字。

我这样做的方法是在 app/config/config.yml 中添加一个新的配置设置,该设置从项目参数文件 (app/config/parameters.ini) 中提取值。

在 app/config/parameters.ini 中,添加一个 database_socket 值:

;[parameters.ini]
database_socket   = "/var/mysql/mysql.sock"

然后在 app/config/config.yml 中,拉入参数值:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        unix_socket: %database_socket%
        charset:  UTF8

这会将自定义套接字路径传递到学说的连接中。

于 2012-02-23T22:25:57.703 回答
2

如果使用 MAMP 您可以在 /var/mysql/ 文件夹中创建指向 /Applications/MAMP/tmp/mysql/mysql.sock 文件的符号链接

首先检查您的 /var/mysql 文件夹是否存在,如果它没有使用:

mkdir /var/mysql

转到上面的文件夹,然后编写以下内容以创建符号链接

sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

您可能还会遇到时区问题(与上述问题无关,但如果您是 mamp 用户,您可能也会遇到这个问题),您可以通过将以下内容放入 /private/etc/php.ini 文件中来解决这些问题(注意:这不是您在 MAMP 文件夹中找到的 php.ini 文件)

date.timezone = "America/Montreal"

注意:您可能需要更改您的实际时区,这可能与我的不同。

参考资料: http ://www.iamseree.com/application-development/doctrine-error-on-mac-osx-it-is-not-safe-to-rely-on-the-systems-timezone-settings-you-需要使用日期时区设置或日期默认时区设置功能

http://mikecroteau.wordpress.com/2011/08/07/symfony2-could-not-create-database-for-connection-named-sqlstatehy000-2002-no-such-file-or-directory/

于 2011-12-29T19:10:13.163 回答