我正在使用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 --force
和propel:build --insert-sql
没有在数据库中插入任何内容。控制台不会出错,而是声明:
Use connection named default in dev environment.
All SQL statements have been inserted.
<?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>
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 --force
或propel:build --insert-sql
命令插入SQL,但两者都不起作用,但所有其他命令都是。我尝试删除推进代码并重新安装(通过作曲家),但无济于事。有没有人遇到过这个问题,这是如何解决的?
答案 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语句,也不执行任何操作。
我不知道如何解决这个问题。