Mapeamento de uma tabela de banco de dados para um atributo de um objeto
-
08-07-2019 - |
Pergunta
Eu me deparei com um lugar no meu projeto atual, onde eu criei várias classes para armazenar uma estrutura de dados complicado na memória e um esquema SQL concluído para armazenar os mesmos dados em um banco de dados. Eu decidi usar SQLAlchemy como uma camada ORM como parece a solução mais flexível que pode adaptar às minhas necessidades.
O meu problema é que eu agora precisa mapear uma tabela inteira para apenas um atributo matriz na memória e estou lutando para descobrir se isso é possível e, se for, como fazê-lo com SQLAlchemy. Ainda é possível para mim mudar as estruturas de dados em código (embora menos do que ideal) se não, mas eu preferiria não.
A tabela em questão é criado usando a seguinte SQL:
CREATE TABLE `works` (
`id` BIGINT NOT NULL auto_increment,
`uniform_title` VARCHAR(255) NOT NULL,
`created_date` DATE NOT NULL,
`context` TEXT,
`distinguishing_characteristics` TEXT,
PRIMARY KEY (`id`),
INDEX (`uniform_title` ASC),
INDEX (`uniform_title` DESC)
) ENGINE = InnoDB DEFAULT CHARSET = utf8 ;
CREATE TABLE `variant_work_titles` (
`id` BIGINT NOT NULL auto_increment,
`work_id` BIGINT NOT NULL,
`title` VARCHAR(255) NOT NULL,
PRIMARY KEY(`id`),
INDEX (`work_id`),
INDEX (`title` ASC),
INDEX (`title` DESC),
FOREIGN KEY (`work_id`)
REFERENCES `works` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
Esta é apenas uma pequena parte da base de dados completa ea mesma coisa vai ser exigido em vários lugares.
Solução
Parece que você quer algo como
work_instance.variants = [<some iterable of variants>]
Se não esclarecer a sua pergunta.
Idealmente, você deve ter 2 mapeamentos para estas 2 tabelas. Não importa se você não vai acessar o segundo mapeamento em qualquer outro lugar. mapeamento work
deve ter um relacionamento um-para-muitos para mapeamento variant
. Isto dar-lhe uma lista de instâncias variant
associados a um work
particular sobre qualquer atributo você define seu relacionamento.