0

私は Scriptella を初めて使用し、次の問題に完全に行き詰まりました。

アクセステーブルを用意しました。私が書いたプログラムを使用してテーブルスキーマを取得しています。出力ファイル ( tableschema.xml) は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<table>
    <column>ID</column>
    <datatype>COUNTER</datatype>
    <column>FirstName</column>
    <datatype>VARCHAR</datatype>
    <column>LastName</column>
    <datatype>VARCHAR</datatype>
    <column>Salary</column>
    <datatype>CURRENCY</datatype>
    <column>SSN</column>
    <datatype>INTEGER</datatype>
</table>

次に、Scriptella を使用して、新しい PostgreSQL データベースを作成する必要があります (可能であれば。可能でない場合は、DB が既に作成されていると想定できます)。提供された XML ファイルを使用して新しいテーブルを作成し (必須)、すべてのデータをアクセス テーブルから PostgreSQL テーブルにコピーする必要があります。

アクセスからのデータ抽出を実装しました。XMLファイルからの情報抽出を実装しました。

Postgres で DB とテーブルを作成することに行き詰まりました。ScriptellaではうまくいかないCREATE DATABASEようです。CREATE TABLE

etl.xmlファイルの私のラフドラフト:

<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd">
<etl>
    <connection id="db1" url="jdbc:odbc:TestDB" driver="scriptella.driver.odbc.Driver" user="Dzmitry" password="a"/>

    <connection id="db2" url="jdbc:odbc:PostgreSQLconnector" driver="scriptella.driver.odbc.Driver" classpath="postgresql.jar" user="Dzmitry" password="a"/>

    <connection id="script" driver="script"/>
    <connection id="java" driver="scriptella.driver.janino.Driver"/>
    <connection id="log" driver="text"/>

    <!--  doesn't work

    <script connection-id="db2" new-tx="true" if="create_databases">
            CREATE DATABASE testDB;
    </script>


    -->


    <query connection-id="db1">
        SELECT * FROM GenInfo;

        <script connection-id="script">
            java.lang.System.out.println("Processing row number " + rownum + " ");
        </script>
        <script connection-id="log">
            ${FirstName}, ${LastName}, ${Salary}, ${SSN}
        </script>
    </query>

    <query connection-id="java">
        import javax.xml.parsers.*;
        import javax.xml.xpath.*;
        import java.io.*;
        import org.w3c.dom.Document;
        import org.xml.sax.*;

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();

        File file = new File("tableschema.xml");
        Document document = docBuilder.parse(file);

        XPathFactory xpFactory = XPathFactory.newInstance();
        XPath xPath = xpFactory.newXPath();

        int numberOfColumns = Integer.parseInt(xPath.evaluate("count(/table/column)", document));


        for(int i = 1; i &lt;= numberOfColumns; i++){ // does not take less than sign
            System.out.print("Column name " + i + ": " + xPath.evaluate("/table/column[" + i + "]", document));
            System.out.println("\tData type " + i + ": " + xPath.evaluate("/table/datatype[" + i + "]", document));
        }

    </query>
</etl>

誰でも私を助けることができますか?
よろしく、ドミトリー。

4

1 に答える 1

1

スクリプトでは、ODBC ドライバーを使用して Postgres にアクセスしています。

driver="scriptella.driver.odbc.Driver"

ドキュメントで説明されているように、JDBC ドライバーを使用することをお勧めします。

<connection driver="postgresql" url="jdbc:postgresql://localhost:5432/DATABASENAME" user="username" password="password">
</connection>

また、 new-tx="true" 属性を省略できます。シナリオで使用する意味がわかりません。したがって、次のような簡単なことから始めます。

<connection connection-id="db2" driver="postgresql" url="jdbc:postgresql://localhost:5432/DATABASENAME" user="Dzmitry" password="a" classpath="postgresql.jar">
</connection>

<script connection-id="db2">
    CREATE TABLE distributors (
        did     integer PRIMARY KEY,
        name    varchar(40)
    );
</script>

この例では、既存のデータベース DATABASENAME のテーブルを作成する方法を示しました。別のデータベースを作成する場合、スクリプトはより複雑になりますが、追加の詳細を提供する前に、既存のデータベースでテーブルを作成できるようになったことを確認する必要があります。

データベースを作成するには、最初に template1 のような既存のデータベースに接続する必要があります (事前にインストールされているはずです)。そこから別のデータベースを作成します。次に、別の接続を使用して他のスクリプトを実行します。テーブル作成スクリプトの接続では、lazy-init 属性を有効にする必要があることに注意してください。そうしないと、存在しないデータベースに対してエラーがスローされます。

<!-- Connection for just for creating a database -->
<connection connection-id="db2_init" driver="postgresql" url="jdbc:postgresql://localhost:5432/template1" user="postgres" password="postgres" classpath="postgresql.jar">
</connection>

<!-- Connection for DDL and data statements. Needs to be lazy-init=true -->
<connection connection-id="db2_tables" driver="postgresql" lazy-init="true" url="jdbc:postgresql://localhost:5432/testDB" user="Dzmitry" password="a" classpath="postgresql.jar">
</connection>

<script connection-id="db2_init" if="create_databases">
    CREATE DATABASE testDB;
</script>
<script connection-id="db2_tables" if="create_schema">
    CREATE TABLE distributors (
        did     integer PRIMARY KEY,
        name    varchar(40)
    );
</script>
于 2013-01-25T09:28:37.617 に答える