1

数十のテーブルを持つデータベースがあります。私のアプリは、それらのテーブルの 1 つだけを扱います。そのテーブルのためだけにスキーマを生成するように推進したいと思います。build.properties でテーブルを指定する方法はありますか?

4

2 に答える 2

2

Propel の単純な拡張 (Propel-1.6.8 に基づくコード例) は、テーブルのカスタムセット (プロパティを使用して設定) を無視できるようにします:

build-propel.xml を拡張します。

<!-- Ignore Tables Feature -->
<taskdef
name="propel-schema-reverse-ignore"
classname="task.PropelSchemaReverseIgnoreTask" classpathRef="propelclasses"/>

build.xml を拡張します。

<target name="reverse-ignore" depends="configure">
   <phing phingfile="build-propel.xml" target="reverse-ignore"/>
</target>

PropelSchemaReverseTask を拡張します。

class PropelSchemaReverseIgnoreTask extends PropelSchemaReverseTask {

/**
 * Builds the model classes from the database schema.
 * @return Database The built-out Database (with all tables, etc.)
 */
protected function buildModel()
{
    // ...

    // Loads Classname reverse.customParserClass if present
    $customParserClassname = $config->getBuildProperty("reverseCustomParserClass");
    if ($customParserClassname!=null) {
        $this->log('Using custom parser class: '.$customParserClassname);
        $parser = $config->getConfiguredSchemaParserForClassname($con, $customParserClassname);
    } else {
        $parser = $config->getConfiguredSchemaParser($con);
    }

    // ...
}

}

関数を GeneratorConfig に追加します。

class GeneratorConfig implements GeneratorConfigInterface {
// ...
/**
 * Ignore Tables Feature:
 * Load a specific SchemaParser class
 * 
 * @param PDO $con
 * @param string $clazzName SchemaParser class to load
 * @throws BuildException
 * @return Ambigous <SchemaParser, unknown>
 */
public function getConfiguredSchemaParserForClassname(PDO $con = null, $clazzName)
{
    $parser = new $clazzName();
    if (!$parser instanceof SchemaParser) {
        throw new BuildException("Specified platform class ($clazz) does implement SchemaParser interface.", $this->getLocation());
    }
    $parser->setConnection($con);
    $parser->setMigrationTable($this->getBuildProperty('migrationTable'));
    $parser->setGeneratorConfig($this);

    return $parser;
}

}

MysqlSchemaParser を拡張します。

class MysqlSchemaIgnoreParser extends MysqlSchemaParser {

public function parse(Database $database, Task $task = null)
{
   $this->addVendorInfo = $this->getGeneratorConfig()->getBuildProperty('addVendorInfo');

    $stmt = $this->dbh->query("SHOW FULL TABLES");

    // First load the tables (important that this happen before filling out details of tables)
    $tables = array();

    $configIgnoreTables = $this->getGeneratorConfig()->getBuildProperty("reverseIgnoreTables");

    $tables_ignore_list = array();
    $tables_ignore_list = explode(",", $configIgnoreTables);

    if ($task) {
        $task->log("Reverse Engineering Tables", Project::MSG_VERBOSE);
    }

    while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
        $name = $row[0];
        $type = $row[1];

        if (!in_array($name, $tables_ignore_list)) {

            // ... 

        } else {
            $task->log("Ignoring table: " .$name);
        }
    }

    // ...
}

}

新しい (オプションの) プロパティを build.properties に追加します。

# Propel Reverse Custom Properties
propel.reverse.customParserClass=MysqlSchemaIgnoreParser
propel.reverse.ignoreTables = table1,table2
于 2015-01-27T15:23:52.773 に答える
1

解決策は、特定のテーブルを無視する独自のスキーマ パーサーを作成することです。除外するこれらのテーブルは、構成ファイルなどから読み取ることができます。

MysqlSchemaParser.phpを見て、このようなパーサーがどのように機能するかを理解してください。このような既存のパーサーを拡張して、parse()メソッドをオーバーライドするだけです。テーブルが追加されると、除外/包含を確認し、サブセット基準を満たす場合にのみ追加します。

カスタム propel タスクの作成方法は Propel cookbook で説明されています。

呼び出す代わりにpropel-gen reverse、カスタマイズしたリバース エンジニアリング タスクを呼び出します。

うまくやれば、Propel プロジェクトへの貢献として追加する価値があると思いますし、あなたは間違いなくその名声に値するでしょう! :-)

于 2013-12-13T17:38:38.237 に答える