在Python / Flask中的SQLAlchemy模型中使用ForeignKey

时间:2017-09-07 10:30:56

标签: python sqlalchemy flask-sqlalchemy

我使用flask-sqlalchemy(Flask的ORM)创建了两个表,其中一部分我总结如下:

Sites  
|---------------------|------------------|------------------|
|         name        |     site_code    |     site_type    |
|---------------------|------------------|------------------|
|       Aberdeen      |         ABD      |       urban      |
|---------------------|------------------|------------------|
|       Cardiff       |         CRD      |       urban      |
|---------------------|------------------|------------------|

Data
|---------------------|------------------|------------------|
|      site_code      |        time      |    temperature   |
|---------------------|------------------|------------------|
|          ABD        |       13:00      |         23       |
|---------------------|------------------|------------------|
|          CRD        |       13:00      |         26       |
|---------------------|------------------|------------------|

我的模型如下:

db = SQLAlchemy()

class Sites(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    site_code = db.Column(db.String(10))
    site_type = db.Column(db.String(100))

    def __init__(self, name, site_code, site_type):
        self.name = name
        self.site_code = site_code
        self.site_type = site_type

class Data(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    site_code = db.Column(db.ForeignKey('sites.site_code'))
    time = db.Column(db.String(100))
    site_type = db.Column(db.String(100))

    def __init__(self, site_code, site_type, temperature):
        self.site_code = site_code
        self.site_type = site_type
        self.temperature = temperature

我不确定每个表中的site_code列是否相关。这是因为虽然它们具有相同的值(ABD,CRD等),因为它们对应于相同的数据监控站点,但它们似乎没有任何其他方式相关。它们是否相关并且指定site_code的外键是否合适?只是因为我在我的数据表中有冗余,每小时我都会一遍又一遍地重复site_code。 Sites表是一个大约20行的站点列表,而Data每小时重复20次。

由于我目前的模型是结构化的,我认为db.ForeignKey('sites.site_code')没有做任何事情,因为我传入了site_code(可以看出我在哪里定义 init for Data)。如果我没有传递它,则值为null - 当我填充数据时,我认为没有任何方法可以知道如何使用站点中的site_code值。

我是否有更好的方法来构建模型,以便我可以从Data中的Sites表引用site_code,这样我就不会在我的Data表中存储冗余的site_code值?或者这不值得担心吗?我在查询数据时需要使用site_code,因此不能只有Sites.id的外键。而不是site_code。例如:

foo = Data.query.filter_by(site_code='ABD') 

1 个答案:

答案 0 :(得分:0)

好的,为了实现您所寻找的目标,您首先要了解如何设计模型,我确定您需要一对一的关系,看看here 并发现了这个:

  

One To One本质上是一个带标量的双向关系   双方属性。为实现此目的,uselist标志指示   标量属性的放置而不是集合的放置   “很多”方面的关系。将一对多转换为   一对之一:

您的代码可以在这里

 db = SQLAlchemy()

class Sites(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    site_code = db.Column(db.String(10))
    site_type = db.Column(db.String(100))
    datas = db.relationship("Data", uselist=False, back_populates="sites_codes")

    def __init__(self, name, site_code, site_type):
        self.name = name
        self.site_code = site_code
        self.site_type = site_type

class Data(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    site_code = db.Column(db.Integer, db.ForeignKey('sites.site_code'))
    time = db.Column(db.String(100))
    site_type = db.Column(db.String(100))
    site_codes = db.relationship("Sites", back_populates="datas")


    def __init__(self, site_code, site_type, temperature, name):
        self.name = name
        self.site_code = site_code
        self.site_type = site_type
        self.temperature = temperature