SQLObjectで複合キー(みたいなもの)

2008-09-07 - とりあえず日記で扱ったネタの続き。

それぞれ、どんなSQL文が出力されるか確認してみた。
誰でもやりゃあすぐ判る情報。
まぁ、これもメモ。
どちらも、UNIQUE制約付けてくれています。付け方違うけど。
継承の実装の仕方、djangoturbogears(の、SQLObject)とで全然違うのね。

django

コード(models.pyから抜粋。引数を適当に間引いている)

class ManagedModel(models.Model):
	created = models.DateTimeField(blank=True)
	creator = models.CharField(max_length=1024)
	updated = models.DateTimeField(blank=True)
	updator = models.CharField(max_length=1024)
	
	class Meta:
		abstract = True

class InstanceSetting(ManagedModel):
	owner_id = models.CharField(max_length=1024)
	owner_type = models.CharField(max_length=1024)
	prefix = models.CharField(max_length=1024)
	name = models.CharField(max_length=1024)
	digit = models.PositiveIntegerField(default=5)
	crawling_time = models.TimeField(null=True)

	class Meta(ManagedModel.Meta):
		unique_together = (('owner_id', 'owner_type', 'prefix'),)

python manage.py sqlした場合
(appは、アプリケーション名)

BEGIN;
CREATE TABLE "app_instancesetting" (
    "id" integer NOT NULL PRIMARY KEY,
    "created" datetime NOT NULL,
    "creator" varchar(1024) NOT NULL,
    "updated" datetime NOT NULL,
    "updator" varchar(1024) NOT NULL,
    "owner_id" varchar(1024) NOT NULL,
    "owner_type" varchar(1024) NOT NULL,
    "prefix" varchar(1024) NOT NULL,
    "name" varchar(1024) NOT NULL,
    "digit" integer unsigned NOT NULL,
    "crawling_time" time NULL,
    UNIQUE ("owner_id", "owner_type", "prefix")
)
;
COMMIT;

turbogears

コード(model.pyから抜粋)

class ManagedModel(InheritableSQLObject):
    created = DateTimeCol(default=datetime.now,notNone=True)
    updated = DateTimeCol(default=datetime.now,notNone=True)
    creator = UnicodeCol(notNone=True)
    updator = UnicodeCol(notNone=True)


class InstanceSetting(ManagedModel):
    name = UnicodeCol(notNone=True)
    ownerType = UnicodeCol(notNone=True)
    ownerId = UnicodeCol(notNone=True)
    prefix = UnicodeCol(notNone=True)
    digit = IntCol()
    crawlingTime = DateTimeCol()
    
    unique = index.DatabaseIndex(ownerType, ownerId, prefix, unique=True)

tg-admin sql sqlした場合

CREATE TABLE managed_model (
    id INTEGER PRIMARY KEY,
    created TIMESTAMP NOT NULL,
    updated TIMESTAMP NOT NULL,
    creator TEXT NOT NULL,
    updator TEXT NOT NULL,
    child_name VARCHAR (255)
);

CREATE TABLE instance_setting (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    owner_type TEXT NOT NULL,
    owner_id TEXT NOT NULL,
    prefix TEXT NOT NULL,
    digit INT,
    crawling_time TIMESTAMP,
    child_name VARCHAR (255)
);
CREATE UNIQUE INDEX instance_setting_unique ON instance_setting (owner_type, owner_id, prefix);