2011-05-01 89 views
5

所以我一直在整个上午用Symfony2进行摆弄,并阅读主要文档或至少一半。我被困在与数据库相关的任何事情上。Symfony2 DBAL&ORM设置

我的一个简单问题是:我们是否事先制定了数据库结构?

文档中说创建实体类,然后使用数据库生成数据库表:在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的和简单的修复是一个端口项添加到数据库连接阵列:

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

我该怎么做,在Symfony2中。

+3

在您的数据库连接设置中使用'unix_socket'参数 – meze 2011-05-02 08:39:27

回答

7

doctrine:database:create命令不会填充表的结构,而是像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(在应用程序/配置),包括学说配置参数
  2. 打开一个窗口,然后进入的根文件夹Symfony的分布(在那里你看到的应用程序,SRC,供应商和网络文件夹)
  3. 运行在MySQL中
  4. 创建数据库
  5. 运行php app/console doctrine:schema:create创建数据库结构
  6. 检查MySQL数据库和结构已经正确创建

希望得到这个帮助。

问候,
马特

+0

我将在哪里定义模式?就像我们在schema.yml中使用Symfony1一样。我完全困惑,请帮助。 – 2011-09-13 06:22:25

+0

首先,我从来没有使用Symfony1,但从我的理解来看,Symfony2中没有单个'schema.yml'。每个实体都必须有自己的模式文件,并且必须将它们放入如下所示的文件中:'@ AcmeBundle/Resources/config/doctrine/EntityClassName.orm.yml'。阅读官方Symfony2手册中的'Databases and Doctrine'上的[documentation](http://symfony.com/doc/current/book/doctrine.html#add-mapping-information),切换到'YAML'标签,而不是默认的一个'Annotations'。 – Matt 2011-09-13 14:43:35

+0

谢谢@Matt。当我从Symfony1来的时候,我感到困惑。 – 2011-09-14 05:10:34

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-are-required-to-use-the-date-timezone-setting-or-the-date_default_timezone_set-function

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

+0

从MAMP 2.0.5 + Symfony 2.0.16开始,这个ln命令是唯一一个能够在书籍章节“数据库和Doctrine”中获得代码的答案!谢谢。 – 2012-07-21 21:36:54

+0

我无法与Lion和Sf 2.1一起工作。我很失望,2012年我们仍在使用的工具非常糟糕。自1998年以来,我一直是一名开发人员,事情似乎越来越糟糕。 – Acyra 2012-08-07 23:58:35

5

原来的问题询问有关如何在Symfony2的配置定义非标准插座。

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

在应用程序/配置/ parameters.ini,添加一个database_socket值:

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

,然后在应用程序/配置/ 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 

即会将自定义套接字路径传递给教条的连接。

+1

这正是我所需要的。我的mysql.sock位于/ tmp目录中。 – zcopley 2012-11-07 00:20:30