Symfony2命令行“propel:sql:insert --force”失败

时间:2013-12-14 04:50:00

标签: php mysql xml symfony propel

问题

我正在使用Symfony开发一个新项目,并尝试在我的本地环境中设置数据库。我正在使用Symfony v.2.3.7,PropelBundle 1.2.13与Propel 1.7,Mac OS X 10.9和PHP 5.4.17。

什么有用

我可以使用propel:database:create创建数据库,并使用propel:database:drop将其删除。我也可以使用propel:sql:build生成的SQL并直接将其插入数据库,然后使用propel:tables:drop删除表。

什么不

我的问题是propel:sql:insert --forcepropel:build --insert-sql没有在数据库中插入任何内容。控制台不会出错,而是声明:

Use connection named default in dev environment.
All SQL statements have been inserted.

守则

schema.xml中

<?xml version="1.0" encoding="UTF-8" ?>
<database name="portfolio" namespace="KristianRandall\Bundle\PortfolioBundle\Model" defaultIdMethod="native">
    <table name="category">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="name" type="varchar" primaryString="true" size="100" required="true"/>
        <column name="description" type="longvarchar"/>
    </table>

    <table name="project">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="name" type="varchar" primaryString="true" size="100" required="true"/>
        <column name="content" type="longvarchar"/>
        <column name="date" type="date"/>
    </table>

    <table name="page">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="name" type="varchar" primaryString="true" size="100" required="true"/>
        <column name="content" type="longvarchar"/>
    </table>
</database>

portfolio.sql(通过propel:sql:build生成)

# This is a fix for InnoDB in MySQL >= 4.1.x
# It "suspends judgement" for fkey relationships until are tables are set.
SET FOREIGN_KEY_CHECKS = 0;

-- ---------------------------------------------------------------------
-- category
-- ---------------------------------------------------------------------

DROP TABLE IF EXISTS `category`;

CREATE TABLE `category`
(
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL,
    `description` TEXT,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM;

-- ---------------------------------------------------------------------
-- project
-- ---------------------------------------------------------------------

DROP TABLE IF EXISTS `project`;

CREATE TABLE `project`
(
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL,
    `content` TEXT,
    `date` DATE,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM;

-- ---------------------------------------------------------------------
-- page
-- ---------------------------------------------------------------------

DROP TABLE IF EXISTS `page`;

CREATE TABLE `page`
(
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL,
    `content` TEXT,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM;

# This restores the fkey checks, after having unset them earlier
SET FOREIGN_KEY_CHECKS = 1;

摘要

我的开发日志中没有输出,数据库没有变化,控制台也没有错误。

我试图通过propel:sql:insert --forcepropel:build --insert-sql命令插入SQL,但两者都不起作用,但所有其他命令都是。我尝试删除推进代码并重新安装(通过作曲家),但无济于事。有没有人遇到过这个问题,这是如何解决的?

2 个答案:

答案 0 :(得分:3)

我终于分析了推进代码并发现了一个肮脏的技巧来避免这种情况:

在config.yml中声明连接时:

dbal:
    default_connection:         default
    connections:
        default:
            driver:             pdo_mysql
            user:               root
            password:           mysql
            dsn:                mysql:host=127.0.0.1;dbname=propeltest

更改&#34;默认&#34;到您的dbname。在这里,propeltest:

dbal:
    default_connection:         propeltest
    connections:
        propeltest:
            driver:             pdo_mysql
            user:               root
            password:           mysql
            dsn:                mysql:host=127.0.0.1;dbname=propeltest

你现在在/vendor/propel/propel1/generator/lib/util/PropelSqlManager.php第51行的setConnections($ connections)函数的arg $连接中有两个连接。

var_dump示例:

array(2) {
  ["propeltest"]=>
  array(8) {
    ["dsn"]=>
    string(38) "mysql:host=127.0.0.1;dbname=propeltest"
    ["user"]=>
    string(4) "root"
    ["password"]=>
    string(5) "mysql"
    ["classname"]=>
    string(8) "DebugPDO"
    ["options"]=>
    array(0) {
    }
    ["attributes"]=>
    array(0) {
    }
    ["settings"]=>
    array(0) {
    }
    ["model_paths"]=>
    array(2) {
      [0]=>
      string(4) "src/"
      [1]=>
      string(7) "vendor/"
    }
  }
  ["default"]=>
  array(8) {
    ["dsn"]=>
    string(38) "mysql:host=127.0.0.1;dbname=propeltest"
    ["user"]=>
    string(4) "root"
    ["password"]=>
    string(5) "mysql"
    ["classname"]=>
    string(8) "DebugPDO"
    ["options"]=>
    array(0) {
    }
    ["attributes"]=>
    array(0) {
    }
    ["settings"]=>
    array(0) {
    }
    ["model_paths"]=>
    array(2) {
      [0]=>
      string(4) "src/"
      [1]=>
      string(7) "vendor/"
    }
  }
}

我不明白为什么propel会创建一个&#34;默认连接&#34;但是这个技巧可以在不改变推进源代码的情况下发挥作用。

答案 1 :(得分:0)

我正在努力解决同样的问题,我看了一下PropelBundle的源代码。看起来PropelBundle中存在一个错误。

更具体地说,在vendor / propel / propel-bundle / Propel / PropelBundle / Command / SqlInsertCommand.php文件中,doSqlInsert()方法使用连接名称调用Propel的insertSql()方法。

但是,Propel的insertSql()方法需要实际SQL文件的名称而不是连接名称作为参数。因此,insertSql()文件找不到要执行的SQL语句,也不执行任何操作。

我不知道如何解决这个问题。