具有具体继承的基本实体

时间:2012-06-16 19:17:49

标签: python sqlalchemy python-elixir

我希望有一个带有字段deleted的基本实体,用于标记已删除的记录。我有2个子类,每个子类都有自己的表,包含所有列:

from elixir import *
from sqlalchemy import create_engine


class Catalog(Entity):
    using_options(inheritance='concrete')
    deleted = Boolean

class Contact(Catalog):
    using_options(inheritance='concrete')
    name = Field(String(60))

class Location(Catalog):
    using_options(inheritance='concrete')
    name = Field(String(100))

setup_all()

metadata.bind = create_engine('sqlite:///', echo=True)
metadata.create_all()

结果:

CREATE TABLE __main___catalog (
        id INTEGER NOT NULL, 
        PRIMARY KEY (id)
)

CREATE TABLE __main___contact (
        id INTEGER NOT NULL, 
        name VARCHAR(60), 
        PRIMARY KEY (id)
)

CREATE TABLE __main___location (
        id INTEGER NOT NULL, 
        name VARCHAR(100), 
        PRIMARY KEY (id)
)

问题:

  1. 如何避免为基本实体创建表? - 已解决:using_options(abstract = True)
  2. 为什么字段deleted不在创建的表中? - 这解决了 - 我忘了把它放在Field
  3. 里面
  4. 我想避免键入每个子类using_options(inheritance='concrete')但仍然具有“具体继承”。有没有办法让它成为所有子类的默认值?

1 个答案:

答案 0 :(得分:0)

这有效:

class Catalog(Entity):

    deleted = Field(Boolean)
    using_options(abstract = True, inheritance = 'concrete')        


class Contact(Catalog):

    name = Field(String(60))


class Location(Catalog):

    name = Field(String(100))

并创建以下表格:

CREATE TABLE __main___contact (
        id INTEGER NOT NULL, 
        deleted BOOLEAN, 
        name VARCHAR(60), 
        PRIMARY KEY (id), 
        CHECK (deleted IN (0, 1))
)

CREATE TABLE __main___location (
        id INTEGER NOT NULL, 
        deleted BOOLEAN, 
        name VARCHAR(100), 
        PRIMARY KEY (id), 
        CHECK (deleted IN (0, 1))
)
相关问题