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

时间:2018-09-16 23:10:17

标签: python

很抱歉,如果这太简单了,但是我是数据库新手。 假设我有一个包含两个表的数据库,一个表用于人员,一个表用于国家。每个人都有一个与之相关的国家。 我想以懒惰的方式将这些表中的项目加载到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方式是什么?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以建立多对一关系,其中许多国家都与一个人相关联。人员将具有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..,
)