鴨乃嘴南蛮 Sesto 何回目かのキックオフ

<< 戻る   トップ >>

鴨乃嘴南蛮現行型が一段落した 2007年前半から7年。新版を作ることにしてイタリア語の '6' で sei と名づけた2011年10月から2年半。名前を '6番目' sesto に変えてから1年半。フレームワークの選定や RDBMS の変更などを検討してようやくプロジェクトの再開である。なんとか秋までに sesto をリリースしたい。最初のバージョンは伝統的な2カラムのブログ形式で、次に携帯端末向けのレイアウトを加え、最後にいわゆるひとつの無意味なデスクトップ風味版を作るつもりだ。

まず、Apache DDL で変換したデータベースを Netbeans 8.0 で使えるようにする。

  1. 変換したデータベースディレクトリ (NanbanWeb) を ~/.netbeans-derby にコピーする
  2. サービスウィンドウのデータベースを右クリックし、新規接続で jdbc:derby://localhost:1527 に接続するように設定する

おっとしまった。ユーザとパスワードを設定していなかった。

  1. ~/.netbeans-derby/NanbanWeb/service.properties を編集する
  2. derby.authentication.provider=BUILTIN
  3. derby.user.username="password"

本当は DDL ⇨ Derby の変換をするときに、できれば Derby Network の方で 'jdbc:derby://localhost:1527/database;create=true;user=username;password=password' としておけばよかったようだ。いまのところ NetBeans からユーザ・パスワードをあとづけする方法は不明。

続いてデータベースからエンティティクラスを生成する。6つある表の内、PING と RELATION は主キーが出ないのでエンティティクラスを生成してくれない。そういえば主キーと外部キーをちゃんと設定しておかなくていけなかったのだ1,2。この設定をどこで行うかというと、DDL ⇨ Derby 変換で行えばよい。

まず、プライマリキーの設定だが、PING と RELATION は複合プライマリキーを使用する。複合させるのは簡単で、DDL の 複数の <column> 要素の primaryKey 属性を true にしてやればよい。

  <table name="relation" description="">
    <column name="article" primaryKey="true" required="false" type="INTEGER" size="10" autoIncrement="false" />
    <column name="category" primaryKey="true" required="false" type="INTEGER" size="10" autoIncrement="false" />
    <foreign-key foreignTable="article" name="fk_category_article">
      <reference local="article" foreign="id" />
    </foreign-key>
    <foreign-key foreignTable="category" name="fk_article_category">
      <reference local="category" foreign="id" />
    </foreign-key>
  </table>

ただし、PING 表の url カラムに注意する必要がある。url は MySQL の text データ型で、それを変換した DDL の LONG VARCHAR は Derby ではプライマリーキーとして使えない。型変換を同時に行う。

  <table name="ping" description="">
    <column name="article" primaryKey="true" required="false" type="INTEGER" size="10" autoIncrement="false" />
    <column name="url" primaryKey="true" required="false" type="LONG VARCHAR" size="6554432672" autoIncrement="false" />
    <foreign-key foreignTable="article" name="fk_ping_article">
      <reference local="article" foreign="id" />
    </foreign-key>
  </table>

外部キーは <foreign-key> 要素で記述する。これは SQL の外部キー制約を XML 要素にしただけだ。

  <table name="trackback" description="">
    <column name="id" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true" />
    <column name="article" primaryKey="false" required="false" type="INTEGER" size="10" autoIncrement="false" /gt;
    ...
    <foreign-key foreignTable="article" name="fk_trackback_article">
      <reference local="article" foreign="id" />
    </foreign-key>
  </table>

あとは幽霊 PING データ (article = 799, 1061) の問題を処理すればこれで変換が可能になる。なお、今後のために、運用中のデータベースからも幽霊 PING を削除しておいた。

Apache DdlUtil 用の Ant スクリプトと変換スキーマのリストを以下に示す。

build.xml
<?xml version="1.0"?>
<project name="MigrateToDerby" basedir=".">
	<path id="classpath">
		<fileset dir="./lib" />
		<fileset dir="/usr/share/java/derby"/>
	</path>

	<target name="export-source-db" description="Dumps db structure and data">
		<taskdef name="databaseToDdl" classname="org.apache.ddlutils.task.DatabaseToDdlTask">
			<classpath refid="classpath"/>
		</taskdef>
		<databaseToDdl modelName="MigrateNanbanDataBase">
			<database url="jdbc:mysql://localhost/nanban_web" 	
				driverClassName="com.mysql.jdbc.Driver"
				username="username" password="password"/>
			<writeSchemaToFile outputFile="db-schema.xml"/>
			<writeDataToFile outputFile="data.xml"/>
		</databaseToDdl>
	</target>

	<target name="import-target-db" description="Creates db and loads data">
		<taskdef name="ddlToDatabase" classname="org.apache.ddlutils.task.DdlToDatabaseTask">
			<classpath refid="classpath"/>
		</taskdef>
		<ddlToDatabase schemaFile="project-schema.xml">
			<database url="jdbc:derby://localhost:1527/NanbanWeb"
				driverClassName="org.apache.derby.jdbc.ClientDriver"
				username="username" password="password"/>
			<createDatabase failonerror="false"/>
			<writeSchemaToDatabase/>
			<writeDataToDatabase datafile="data.xml"/>
		</ddlToDatabase>
	</target> 
</project> 
project-schema.xml
<?xml version='1.0' encoding='UTF-8'?>
<database xmlns="http://db.apache.org/ddlutils/schema/1.1" name="MigrateNanbanDataBase">
  <table name="article" description="">
    <column name="id" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true" />
    <column name="title" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="content" primaryKey="false" required="false" type="LONGVARCHAR" size="16777215" autoIncrement="false" />
    <column name="excerption" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="created" primaryKey="false" required="false" type="TIMESTAMP" size="19" autoIncrement="false" />
    <column name="updated" primaryKey="false" required="false" type="TIMESTAMP" size="19" autoIncrement="false" />
  </table>

  <table name="category" description="">
    <column name="id" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true" />
    <column name="title" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="parent" primaryKey="false" required="false" type="INTEGER" size="10" autoIncrement="false" />
  </table>

  <table name="object" description="">
    <column name="id" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true" />
    <column name="data" primaryKey="false" required="false" type="BLOB" size="16777215" autoIncrement="false" />
    <column name="title" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="type" primaryKey="false" required="false" type="VARCHAR" size="32" autoIncrement="false" />
    <column name="updated" primaryKey="false" required="false" type="TIMESTAMP" size="19" autoIncrement="false" />
  </table>

  <table name="ping" description="">
    <column name="article" primaryKey="true" required="false" type="INTEGER" size="10" autoIncrement="false" />
    <column name="url" primaryKey="true" required="false" type="VARCHAR" size="32672" autoIncrement="false" />
    <foreign-key foreignTable="article" name="fk_ping_article">
      <reference local="article" foreign="id" />
    </foreign-key>
  </table>

  <table name="relation" description="">
    <column name="article" primaryKey="true" required="false" type="INTEGER" size="10" autoIncrement="false" />
    <column name="category" primaryKey="true" required="false" type="INTEGER" size="10" autoIncrement="false" />
    <foreign-key foreignTable="article" name="fk_category_article">
      <reference local="article" foreign="id" />
    </foreign-key>
    <foreign-key foreignTable="category" name="fk_article_category">
      <reference local="category" foreign="id" />
    </foreign-key>
  </table>

  <table name="trackback" description="">
    <column name="id" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true" />
    <column name="article" primaryKey="false" required="false" type="INTEGER" size="10" autoIncrement="false" />
    <column name="url" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="recieved" primaryKey="false" required="false" type="TIMESTAMP" size="19" autoIncrement="false" />
    <column name="blog_name" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="title" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="excerpt" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="ip" primaryKey="false" required="false" type="LONGVARCHAR" size="65535" autoIncrement="false" />
    <column name="accept" primaryKey="false" required="false" type="CHAR" size="2" default="N" autoIncrement="false" />
    <foreign-key foreignTable="article" name="fk_trackback_article">
      <reference local="article" foreign="id" />
    </foreign-key>
  </table>
</database>

作成: 2014-05-22 11:20:54.0更新: 2014-05-23 02:06:00.0
http://museo-anonimo.jp/nanban/?id=1272,http://museo-anonimo.jp/nanban/tr/1272