当前位置: 代码迷 >> python >> 重用从数据库实例化的对象
  详细解决方案

重用从数据库实例化的对象

热度:29   发布时间:2023-06-19 09:12:03.0

抱歉,这太简单了,但是我是数据库新手。 假设我有一个包含两个表的数据库,一个表用于人员,一个表用于国家。 每个人都有一个与之相关的国家。 我想以懒惰的方式将这些表中的项目加载到python对象中。 现在,我正在遍历“人员”中的所有行并为它们实例化对象。 因此,对于每个“人”,我都有一个对象,现在,如果我要访问与某人相关联的国家/地区,则将获得country_id并实例化一个全新的“国家”实例(即使所有人都具有相同的国家/地区)。 例如,如果person1.country为XXX,person2.country为XXX,则对象ID不同

class Person(object):
    def __init__(self, id):
         self.id = id

    def country():
         ...
         country_id = (gets id from db here)
         self.country = Country(country_id)

所以我会得到

id(person1.country) -> 123
id(person2.country) -> 456

让两个人共享同一个国家/地区实例的最Python方式是什么?

谢谢您的帮助

您可以将Country实施为单例模式。

尽管我要问-为什么重要呢? 只要person1.country == person2.country ,为什么person1.country == person2.country关心ID是否相同?

您可以与许多国家/地区建立多人一对一关系。 人员将具有country_id作为关联国家/地区ID的外键约束。 您基本上必须对关联的国家/地区进行查找,并从国家/地区分配正确的ID。 对于国家/地区表,您可能希望将所有已知国家/地区预填到该表中。

如果您决定删除国家/地区表中的条目,该约束可防止您拥有不匹配的ID。 您可以定义其他属性,例如从表中删除国家或更新国家后如何删除条目。 也就是说,您可以在人员表中将country_id设置为null或删除与该国家/地区关联的所有人员。 查找外键约束,您应该找到有关各种约束属性的更多材料。 如果仍然有与该条目关联的人,则可以将其删除为非法。

CREATE TABLE Person (
  id BIGINT NOT NULL,
  country_id BIGINT NOT NULL,
  etc ...,
  PRIMARY KEY(id),
  FOREIGN KEY(country_id) REFRENCES Country(id)
)

CREATE TABLE Country(
 id BIGINT NOT NULL,
 etc..,
)
  相关解决方案