推进 sql:insert 抛出错误“无法解析 sqldb.map 的内容”

Posted

技术标签:

【中文标题】推进 sql:insert 抛出错误“无法解析 sqldb.map 的内容”【英文标题】:propel sql:insert throws error 'Unable to parse contents of sqldb.map' 【发布时间】:2014-08-10 18:14:58 【问题描述】:

这些天我正在尝试使用 Propel 构建一个项目。我在propelorm.org/documentation/02-buildtime.html 上完成了基本的“书店”教程,但是当我尝试最终通过 propel 插入生成的 sql 代码以填充数据库时,抛出以下错误:

[异常] 无法解析“/sqldb.map”的内容。

很遗憾,我不知道出了什么问题。我尽可能准确地按照教程进行操作。

关于我的安装和到目前为止我所做的事情的信息:

1) 本地主机安装 (Mac OS 10.8.5) 与 php 5.4.27(DOM 模块、PDO 和 SPL 启用)和 mysql 5.6.19。

2) 成功解析 Composer.json:


    "require": 
        "propel/propel": "~2.0@dev"
     ,
    "autoload": 
        "classmap": ["bookstoreDb/generated-classes/"]
     

3) 使用外键创建了一个 schema.xml,与教程 (propelorm.org/documentation/02-buildtime.html) 中的完全一样。

4) 在子文件夹 'conf' 中创建了一个配置文件 propel.yaml,就像在教程中一样。

5) 使用推进脚本生成必要的 sql (propel sql:build)、模型 (propel model:build) 和配置文件 (propel config:convert)。这些命令的结果如教程中所示。

6)通过终端成功创建数据库“书店”。

7) 尝试通过propel sql:insert 插入sql 代码。现在抛出上述错误:

[异常] 无法解析“/sqldb.map”的内容。

这里是项目的index.php

    // setup the autoloading
    require_once 'vendor/autoload.php';
    // setup Propel
    require_once 'bookstoreDb/generated-conf/config.php';

    // Here I get the parse error: parse error in ../bookstore/bookstoreDb/generated-classes/Base/Author.php on line 138
    $author = new Author();
    $author->setFirstName('Jane');
    $author->setLastName('Austen');
    $author->save();

这里是 config.php

$serviceContainer = \Propel\Runtime\Propel::getServiceContainer();
$serviceContainer->checkVersion('2.0.0-dev');
$serviceContainer->setAdapterClass('bookstore', 'mysql');
$manager = new \Propel\Runtime\Connection\ConnectionManagerSingle();
$manager->setConfiguration(array (
  'classname' => 'Propel\\Runtime\\Connection\\ConnectionWrapper',
  'dsn' => 'mysql:host=localhost;dbname=bookstore',
  'user' => 'root',
  'password' => 'password',
  'attributes' =>
  array (
    'ATTR_EMULATE_PREPARES' => false,
  ),
));
$manager->setName('bookstore');
$serviceContainer->setConnectionManager('bookstore', $manager);
$serviceContainer->setDefaultDatasource('bookstore');

问题可能出在哪里?还有其他方法可以设置基本项目吗?我会很感激每一个帮助!谢谢!

【问题讨论】:

【参考方案1】:

我为此提交了一个问题:https://github.com/propelorm/Propel2/issues/694

SqlBuildCommand uses configured sql-dir 
$manager->setWorkingDirectory($generatorConfig->getSection('paths')['sqlDir'])

SqlInsertCommand only uses the command line option 
$manager->setWorkingDirectory($input->getOption('sql-dir'));

使用正确的 sql 目录添加 --sql-dir 选项以推动 sql:insert 确实有效

修复已提交https://github.com/propelorm/Propel2/pull/695,但尚未合并

【讨论】:

能否请您澄清一下--sql-dir 和--config-dir 分别应该进入哪些目录?新手在这里,所以我不确定。谢谢。

以上是关于推进 sql:insert 抛出错误“无法解析 sqldb.map 的内容”的主要内容,如果未能解决你的问题,请参考以下文章

vb sql insert into 语句语法错误 求解

sql insert into语句错误

SQL Insert 语句,没有错误或异常,但没有插入数据

语法错误:来自 Python + Scrapy 的 SQL INSERT?

使用 PDO SQL INSERT INTO 的 PHPunit 测试函数未定义数组键错误

SQL INSERT INTO 多行 [重复]