Propel PostgreSQL Migration无法找到适配器

时间:2013-06-18 21:32:32

标签: php postgresql orm migration propel

我正在尝试在我的开发Propel项目中首次使用迁移(因此我不必重新插入15MB的数据),但是遇到了一些困难。我在架构中进行了更改并运行propel-gen diff。我第一次收到错误,它无法找到我的buildtime-conf.xml文件。我还没有制作一个(因为没有必要),但请注意结构应该与runtime-conf.xml相同。我将runtime-conf.xml复制到了buildtime-conf.xml。现在收到以下错误:

[propel-sql-diff] Reading databases structure...
[phingcall] Unable to find adapter for datasource [project].
Execution of target "sql-diff" failed for the following reason: /var/www/project/vendor/propel/propel1/generator/build-propel.xml:317:26: Execution of the target buildfile failed. Aborting.
    [phing] /var/www/project/vendor/propel/propel1/generator/build-propel.xml:317:26: Execution of the target buildfile failed. Aborting.

我的运行时和构建时文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <propel>
        <datasources default="project">
            <datasource id="project">
                <adapter>pgsql</adapter>
                <connection>
                    <dsn>pgsql:host=###.###.###.###;dbname=database</dsn>
                    <user>USER</user>
                    <password>PASS</password>
                </connection>
            </datasource>
        </datasources>
    </propel>
</config>

我的架构与此相符:

<?xml version="1.0" encoding="UTF-8"?>
<database name="project" defaultIdMethod="native">
    <table schema="accounts" name="accounts" phpName="Account" package="accounts">
        <column />
    </table>
</database>

我尝试将buildtime-conf更改为<datasource id="testing">,错误更改为Unable to find adapter for datasource [testing]。因此,就我所知,错误在于实际的buildtime-conf文件(而不是架构)。我想也许Propel找不到PostgreSQL的适配器(即使它在我的runtime-conf中工作正常),所以我尝试将我的适配器更改为mysql。它提出了同样的无法找到适配器错误。

我完全迷失了,想法?

更新:,因此我可以进入/Propel/runtime/lib/Propel.php并找到引发Unable to find adapter例外的行。我通过添加行self::$configuration['datasources'][$name]['adapter'] = 'pgsql'手动定义变量,它可以工作。这显然不是现在验证有用,因为我无法在不重做此更改的情况下更新Propel。我在Propel.php中转储self::$configuration,它是NULL,有什么想法吗?

2 个答案:

答案 0 :(得分:3)

在最新的稳定版Propel(1.7.1)中,添加以下代码是不可能的:

self::$configuration['datasources'][$name]['adapter'] = 'mysql';

导致以下错误:

Indirect modification of overloaded element of PropelConfiguration has no effect

这就是为什么,如果你只有一个适配器,你可以使用:

/*
if (!isset(self::$configuration['datasources'][$name]['adapter'])) {
    throw new PropelException("Unable to find adapter for datasource [" . $name . "].");
}
*/
$db = DBAdapter::factory('mysql');
// register the adapter for this name
self::$adapterMap[$name] = $db;

仅在使用./propel-gen diff时才会发生此错误。还是很奇怪。希望他们能尽快解决。

答案 1 :(得分:3)

看起来将Composer依赖关系切换到dev-master修复此问题 - 在撰写本文时,当前版本(1.7.1)与master之间存在20 commits difference。迁移补丁专门针对is here

希望在适当的时候发布1.7.2版本,但应该注意的是,团队的开发工作目前可能会集中在Propel2上(仍然是alpha版)。