SQLObjectで複合キー(みたいなもの)
2008-09-07 - とりあえず日記で扱ったネタの続き。
それぞれ、どんなSQL文が出力されるか確認してみた。
誰でもやりゃあすぐ判る情報。
まぁ、これもメモ。
どちらも、UNIQUE制約付けてくれています。付け方違うけど。
継承の実装の仕方、djangoとturbogears(の、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)
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);