最近最新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時に入れる初期データを定義します。
各タグの説明
属性 |
説明 |
値 |
必須 |
name |
データベース名 |
text |
○ |
class |
クラス名 |
text |
renew |
「テーブルクラスを更新する」の初期状態 |
true/false |
属性 |
説明 |
値 |
必須 |
name |
テーブル名 |
text |
○ |
class |
クラス名 |
text |
|
属性 |
説明 |
値 |
デフォルト |
必須 |
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側にユニークキーを発行はしていないようです。
属性 |
説明 |
値 |
必須 |
name |
クラス名(テーブル名ではない) |
text |
○ |
属性 |
説明 |
値 |
必須 |
name |
テーブル名 |
text |
○ |
属性 |
説明 |
値 |
必須 |
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によって扱いが変わります)