SQLAlchemy Mixin需要映射实体got实现

2024-09-29 19:20:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组模型。你知道吗

class Asset(db.Model):
    __tablename__ = 'assets'

    asset_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    asset_type_id = db.Column(db.ForeignKey('asset_types.asset_type_id'))
    ...

    __mapper_args__ = {
        'polymorphic_on': asset_type_id
    }



class Vehicle(Asset):
    __tablename__ = 'vehicles'

    asset_id = db.Column(db.ForeignKey('assets.asset_id'), primary_key=True)
    ...
    ...
    __mapper_args__ = {
        'polymorphic_identity':2
    }

我想将Vehicle混入一个具有自引用方法的类中。像这样:

from library.models import Vehicle as EsdbVehicle

class Vehicle(EsdbVehicle):

def update_usage(self, db_session, odometer):
        self.odometer = odometer
        db_session.commit()

当我查询EsdbVehicle模型vehicles = db_session.query(EsdbVehicle).all()时,我得到了115个结果,它们与我的数据库相匹配。但是,当我查询实现工具时,得到0个结果。我错过了什么?你知道吗


Tags: 模型idtruedbsessiontypecolumnasset
1条回答
网友
1楼 · 发布于 2024-09-29 19:20:04

如果不建立DB连接并运行代码,我无法100%确定这一点,但我的直觉告诉我,这并没有按预期工作,因为在SQLAlchemy看来,您似乎在尝试执行表继承(但由于您没有这样做,而且类定义不完整,SQLAlchemy很困惑),而您真正想要的是混入。你知道吗

我会尝试更像这样的方法:

class Vehicle(Asset):
    # stuff...
    __mapper_args__ = {
        'polymorphic_on': 'vehicle_subtype',
        'polymorphic_identity': 'base_vehicle'
    }

class UsageMixin(object):

    def update_usage(self, *args):
        # stuff...
        pass


class VehiclesThatUpdate(Vehicle, UsageMixin):

    __mapper_args__ = {
        'polymorphic_identity': 'updating_vehicles'
    }

应该起作用的原因是,每次扩展ORM映射类时,实际上是在告诉SQLAlchemy您希望执行某种表继承。在这种情况下,您可以不添加类型(对于STI),因为您没有添加属性(列),而只是添加了功能。你知道吗

如果这不工作(或是不完整的),只要添加一个评论,我会调整。你知道吗

编辑:另一个想法。另一种方法是跳过继承,只编写对Vehicle类进行操作的函数。它们不一定是方法。我经常这样做是为了避免实际的SQL模型和类/方法结构之间的额外耦合。你知道吗

你使用ORM的次数越多,你就越开始意识到经常使用更少他们的特性会更好。你知道吗

相关问题 更多 >

    热门问题