nazolabo

フリーランスのWebエンジニアが近況や思ったことを発信しています。

project.xml

最近最新Pythonエクスプローラ買いました!Django勉強中です。
というわけでrhacoがDjango的だという部分の1つにデータベース設計がDRYな点があります。RailsのARとかだと、ある程度は完成されたDB定義から吸い出してくれますが、そこからさらに細かい定義をmodelに書いていく必要があり、二度手間になってしまいます。最初からmodelを書いて、そっからDBにSQLを投げれば、書く手間が省けるだろうという構想らしいです。(とは言っても、DBMS固有の拡張を使う時には無理がありそうですが…)
それを実現するためにはproject.xmlというファイルに定義をがりがり書いていく必要があります。(ちなみにDjangoはクラス定義を直接書くようです)
基本的には、http://d.hatena.ne.jp/rhaco/20070114を見れば十分なのですが、増えてる要素もあるので、テーブル定義周りに限ってまとめてみようと思います。
データベース部分だけ抜き出すと、

<database name="database_name">
  <table name="table_name1">
    <column name="column_name1" type="integer" primary="true" />
    <column name="column_name2" type="string" size="100" require="true" index="true" />
  </table>
  <table name="table_name2">
    <column name="column_name1" type="integer" reference="table_name1.column_name1" />
  </table>
  <default name="table_name1">
    <data>
      <column name="column_name1" value="1" />
      <column name="column_name2" value="abc" />
    </data>
    <data>
      <column name="column_name1" value="2" />
      <column name="column_name2" value="def" />
    </data>
  </default>
</database>

基本的には大体このような構造になります。(動作確認はしていません)
database,table,columnは見た通りで、defaultはcreate table時に入れる初期データを定義します。

各タグの説明

  • database
属性 説明 必須
name データベース名 text
class クラス名 text
renew 「テーブルクラスを更新する」の初期状態 true/false
  • table
属性 説明 必須
name テーブル名 text
class クラス名 text
  • column
属性 説明 デフォルト 必須
name カラム名 text
type カラムの型 別記 string
default 未入力時の値 text null
size カラムのデータ長 int
reference カラムの参照元キー "テーブル名.カラム名"
primary プライマリキーかどうか true/false false
unique ユニークキーかどうか true/false false
index インデックスかどうか true/false false
require 必須項目かどうか true/false false
uniquewith 複数項目でのユニークキー?(未調査) カンマ区切り

uniqueはフレームワークレベルでの実装です。DBMS側にユニークキーを発行はしていないようです。

  • extra
    • 基本的にcolumnと同じ(未調査)
  • default
属性 説明 必須
name クラス名(テーブル名ではない) text
  • default
属性 説明 必須
name テーブル名 text
  • data
    • 特になし(1レコード単位を示す)
  • column(default)
属性 説明 必須
name カラム名 text
value 値名 text

カラムの型

名前 説明
string 文字列
text 文字列
email メールアドレス
tel 電話番号
zip 郵便番号
integer 整数
float 浮動小数点数
date 日付
timestamp 日付時刻
time 時刻
serial 連番(auto_increment)
boolean 真偽値

dateとtimestampにおいて、defaultを"sysdate"とすると、更新日時が記録されます。stringとtextの違いはありません。(それぞれのDBMSによって扱いが変わります)