将数据库表映射到对象的属性

0 投票
1 回答
1563 浏览
提问于 2025-04-15 11:26

在我现在的项目中,我遇到了一个地方,我创建了几个类来在内存中存储一个复杂的数据结构,同时也完成了一个SQL模式,用于在数据库中存储相同的数据。我决定使用SQLAlchemy作为ORM层,因为它看起来是最灵活的解决方案,可以根据我的需求进行调整。

我现在的问题是,我需要将整个表映射到内存中的一个数组属性上,但我不知道这是否可能,如果可能的话,如何用SQLAlchemy来实现。如果不行,我还是可以在代码中更改数据结构(虽然这不是最理想的),但我更希望不这样做。

这里提到的表是通过以下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 ;

这只是整个数据库的一小部分,类似的需求在多个地方都会出现。

1 个回答

1

看起来你想要的是这样的东西:

work_instance.variants = [<some iterable of variants>]

如果不是,请在你的问题中说明清楚。

理想情况下,你应该有两个映射,分别对应这两个表。即使你在其他地方不需要使用第二个映射也没关系。work 映射应该和 variant 映射有一种一对多的关系。这样,你就可以得到一个与特定 work 相关联的 variant 实例列表,这个关系是基于你定义的某个属性。

撰写回答