в попытке изучить 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.У нас есть сотни дочерних таблиц в нашей производственной среде, и, учитывая объем данных, это действительно ускоряет процесс, поэтому я хотел бы сохранить ту же структуру.я могу запросить у родителя, и пока я даю ему правильное 'имя_системы', он сразу же знает, какую дочернюю таблицу посмотреть.
Я хочу эмулировать это с помощью 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»?мое понимание далеко?
Понимание того, что я должен делать, было бы поразительно.