randak
randak

Reputation: 2001

Symfony2 command line "propel:sql:insert --force" failing

The Problem

I am working on a new project using Symfony and am trying to set up the database in my local environment. I am using Symfony v. 2.3.7, PropelBundle 1.2.13 with Propel 1.7, Mac OS X 10.9, and PHP 5.4.17.

What Works

I am able to create the database using propel:database:create and delete it using propel:database:drop. I can also use the SQL generated by propel:sql:build and directly insert it into the database, and then delete the tables using propel:tables:drop.

What Doesn't

My problem is that propel:sql:insert --force and propel:build --insert-sql do not insert anything into the database. The console does not give an error, but instead states:

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

The Code

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 (Generated via 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;

Summary

There is no output in my dev log, no changes in my database, and no error in the console.

I am trying to insert SQL via the propel:sql:insert --force or propel:build --insert-sql commands, and neither is working, but all the other commands are. I tried deleted the propel code and reinstalling (via composer) but to no avail. Has anyone encountered this problem before, and how is this resolved?

Upvotes: 1

Views: 1012

Answers (2)

Yoann53
Yoann53

Reputation: 46

I finally analysed the code of propel and found a dirty trick to avoid that :

When you declare your connection in config.yml :

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

Change "default" to your dbname. Here, propeltest :

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

You have now two connections in the arg $connections in the setConnections($connections) function in /vendor/propel/propel1/generator/lib/util/PropelSqlManager.php line 51.

var_dump example :

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/"
    }
  }
}

I don't understand why propel creates a "default connection" but this trick works without changing the source code of propel.

Upvotes: 3

Tero Kilkanen
Tero Kilkanen

Reputation: 328

I was struggling with the same issue, and I took a look into PropelBundle's source code. It looks like there is a bug in PropelBundle.

More specifically, in vendor/propel/propel-bundle/Propel/PropelBundle/Command/SqlInsertCommand.php file, the doSqlInsert() method calls Propel's insertSql() method with a connection name.

However, Propel's insertSql() method expects the name of the actual SQL file instead of the connection name as argument. Therefore the insertSql() file finds no SQL statements to execute, and does nothing.

I don't know how this could be fixed though.

Upvotes: 0

Related Questions