当前位置: 首页 > 面试题库 >

SQLAlchemy继承

傅星光
2023-03-14
问题内容

对于sqlalchemy下的继承,我有些困惑,以至于我什至不确定在这里应该使用哪种继承类型(单表,联接表,具体)。我有一个基类,其中包含一些在子类之间共享的信息,以及一些完全独立的数据。有时,我需要所有类的数据,有时只需要子类的数据。这是一个例子:

class Building:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Commercial(Building):
    def __init__(self, x, y, business):
        Building.__init__(self, x, y)
        self.business = business

class Residential(Building):
    def __init__(self, x, y, numResidents):
        Building.__init__(self, x, y, layer)
        self.numResidents = numResidents

如何使用声明式将其转换为SQLAlchemy?那么,我将如何查询位于x>5和的建筑物y>3?或哪些居民楼只有一名居民?


问题答案:

选择如何表示继承主要是数据库设计的问题。为了提高性能,单表继承通常是最好的。从良好的数据库设计角度来看,联接表继承会更好。通过联接表继承,您可以拥有数据库强制实施的子类的外键,对子类字段具有非null约束要简单得多。具体表继承在两种情况下都是最糟糕的。

具有声明性的单表继承设置如下所示:

class Building(Base):
    __tablename__ = 'building'
    id = Column(Integer, primary_key=True)
    building_type = Column(String(32), nullable=False)
    x = Column(Float, nullable=False)
    y = Column(Float, nullable=False)
    __mapper_args__ = {'polymorphic_on': building_type}

class Commercial(Building):
    __mapper_args__ = {'polymorphic_identity': 'commercial'}
    business = Column(String(50))

class Residential(Building):
    __mapper_args__ = {'polymorphic_identity': 'residential'}
    num_residents = Column(Integer)

要使其加入表继承,您需要添加

__tablename__ = 'commercial'
id = Column(None, ForeignKey('building.id'), primary_key=True)

子类。

两种方法的查询基本相同:

# buildings that are within x>5 and y>3
session.query(Building).filter((Building.x > 5) & (Building.y > 3))
# Residential buildings that have only 1 resident
session.query(Residential).filter(Residential.num_residents == 1)

控制加载哪些字段,可以使用query.with_polymorphic()方法。

使用继承进行数据映射时要考虑的最重要的事情是您实际上是需要继承还是可以进行聚合。如果您需要更改建筑物的类型,或者建筑物可以同时具有商业和居住方面,那么继承将是一个痛苦。在这些情况下,通常最好将商业和住宅方面作为相关对象。



 类似资料:
  • 问题内容: 我正在使用Flask和SQLAlchemy。我使用了自己的抽象基类和继承。当我尝试在python shell中使用模型时,出现以下错误: 我该如何解决? 码: manage.py: init.py: database.py: models.py: controllers.py: 问题答案: 尝试添加 在你的User类下

  • 在Flask Web应用程序中使用原始SQL在数据库上执行CRUD操作可能很繁琐。 相反, SQLAlchemy是一个功能强大的OR Mapper ,它为应用程序开发人员提供了SQL的全部功能和灵活性。 Flask-SQLAlchemy是Flask扩展,它将对SQLAlchemy的支持添加到Flask应用程序中。 What is ORM (Object Relation Mapping)? 大多数

  • 问题内容: 我是flask和sqlalchemy的新手,我只是开始在flask应用程序上工作,现在我正在使用sqlalchemy。我想知道使用flask-sqlalchemy与sqlalchemy是否可以获得任何显着的好处。 问题答案: 主要功能是与Flask应用程序正确集成-它创建并配置引擎,连接和会话,并将其配置为与Flask应用程序一起使用。 此设置非常复杂,因为我们需要创建作用域会话并根据

  • 我正在建立一个小网站,我已经在SQLAlChemy中拥有了我所有的模型。该网站将发布一些离线计算的信息。只有结果将被发布到一个精简的数据库,即它包含结果,而不是原始数据,但网站需要查询结果。 我将使用Flask,因为我的模型已经用Python驱动了(通过SWIG在C中进行了一些繁重的工作),我不想使用Django。 我敢肯定,以前有人问过这个问题,通常没有太多理由的咒语是“使用炼金术”。问题是为什

  • 问题 如何在web.py中使用sqlalchemy 方案 创建一个钩子并使用sqlalchemy的scoped session (http://www.sqlalchemy.org/docs/05/session.html#unitofwork_contextual) import string import random import web from sqlalchemy.orm impor

  • SQLAlchemy 是一个Python 的SQL 工具包以及数据库对象映射框架。它包含整套企业级持久化模式,专门为高效和高性能的数据库访问。 示例代码: from sqlalchemy import Column, DateTime, String, Integer, ForeignKey, funcfrom sqlalchemy.orm import relationship, backref