sqlalchemy использование наследования в postgres

в попытке изучить sqlalchemy (и python) я пытаюсь дублировать уже существующий проект, но у меня возникают проблемы с выяснением sqlalchemy и наследования с помощью postgres.

вот пример того, что делает наша база данных postgres (очевидно, это упрощено):

CREATE TABLE system (system_id SERIAL PRIMARY KEY, 
                     system_name VARCHAR(24) NOT NULL);
CREATE TABLE file_entry(file_entry_id SERIAL, 
                        file_entry_msg VARCHAR(256) NOT NULL, 
                        file_entry_system_name VARCHAR(24) REFERENCES system(system_name) NOT NULL);
CREATE TABLE ops_file_entry(CONSTRAINT ops_file_entry_id_pkey PRIMARY KEY (file_entry_id), 
     CONSTRAINT ops_system_name_check CHECK ((file_entry_system_name = 'ops'::bpchar))) INHERITS (file_entry);
CREATE TABLE eng_file_entry(CONSTRAINT eng_file_entry_id_pkey PRIMARY KEY (file_entry_id),
     CONSTRAINT eng_system_name_check CHECK ((file_entry_system_name = 'eng'::bpchar)) INHERITS (file_entry);
CREATE INDEX ops_file_entry_index ON ops_file_entry USING btree (file_entry_system_id);
CREATE INDEX eng_file_entry_index ON eng_file_entry USING btree (file_entry_system_id);

И затем вставки будут выполняться с помощью триггера, чтобы они были правильно вставлены в дочерние базы данных. Что-то вроде:

CREATE FUNCTION file_entry_insert_trigger() RETURNS "trigger"
    AS $$
DECLARE 
BEGIN
     IF NEW.file_entry_system_name = 'eng' THEN
        INSERT INTO eng_file_entry(file_entry_id, file_entry_msg, file_entry_type, file_entry_system_name) VALUES (NEW.file_entry_id, NEW.file_entry_msg, NEW.file_entry_type, NEW.file_entry_system_name);
     ELSEIF NEW.file_entry_system_name = 'ops' THEN
        INSERT INTO ops_file_entry(file_entry_id, file_entry_msg, file_entry_type, file_entry_system_name) VALUES (NEW.file_entry_id, NEW.file_entry_msg, NEW.file_entry_type, NEW.file_entry_system_name);
     END IF;
     RETURN NULL;
 END;
 $$ LANGUAGE plpgsql;

Таким образом, у меня есть родительская таблица с внешним ключом для другой таблицы. то у меня есть 2 дочерних таблицы, и вставки выполняются на основе заданного значения. в моем примере выше, если file_entry_system_name равно 'ops', тогда строка переходит в таблицу ops_file_entry; 'eng' переходит в eng_file_entry_table. у нас есть сотни дочерних таблиц в нашей производственной среде, и, учитывая объем данных, это действительно ускоряет работу, поэтому я хотел бы сохранить эту структуру. я могу запросить родительский элемент, и пока я даю ему правильное 'system_name', он сразу же знает, в какую дочернюю таблицу нужно заглянуть.

Я хочу подражать этому с помощью sqlalchemy, но я не могу найти никаких примеров, которые вдавайтесь в это подробнее. Я смотрю на sql, созданный sqlalchemy на примерах, и могу сказать, что он не делает ничего похожего на это на стороне базы данных.

Лучшее, что я могу придумать, это что-то вроде:

class System(_Base):
    __tablename__ = 'system'
    system_id = Column(Integer, Sequence('system_id_seq'), primary_key = True)
    system_name = Column(String(24), nullable=False)
    def __init(self, name)
        self.system_name = name
class FileEntry(_Base):
    __tablename__ = 'file_entry'
    file_entry_id = Column(Integer, Sequence('file_entry_id_seq'), primary_key=True)
    file_entry_msg = Column(String(256), nullable=False)
    file_entry_system_name = Column(String(24), nullable=False, ForeignKey('system.system_name'))
    __mapper_args__ = {'polymorphic_on': file_entry_system_name}
    def __init__(self, msg, name)
        self.file_entry_msg = msg
        self.file_entry_system_name = name
class ops_file_entry(FileEntry):
    __tablename__ = 'ops_file_entry'
    ops_file_entry_id = Column(None, ForeignKey('file_entry.file_entry_id'), primary_key=True)
    __mapper_args__ = {'polymorphic_identity': 'ops_file_entry'}

в конце концов, что я скучаю? как мне сказать sqlalchemy связать все, что вставлено в FileEntry, с системным именем 'ops', чтобы перейти к таблице 'ops_file_entry'? мое понимание далеко?

Было бы здорово понять, что я должен делать.

6
задан jasonmclose 21 July 2011 в 20:49
поделиться