对模型类的__init__方法所做的更改似乎未生效

时间:2019-04-05 20:05:16

标签: python sqlalchemy flask-sqlalchemy

我有两个特殊的模型类,这些类在测试过程中给我带来错误,在检查每种方法时,我确定我的问题是我输入错误的结果。

我已经根据需要在两个类中进行了更改,但是重新运行测试会产生相同的错误。我什至尝试删除我的架构并使用Flask-SQLAlchemy的create_all()方法重新创建它,但仍然遇到问题。

Metrics类中,__init__方法中的变量是错误的并且缺少下划线(即:self.name而不是self._name)。我通过将它们更改为self._nameself._metric_type

来解决此问题

在HostMetricMapping类中,我需要将host_id参数添加到__init__方法中,因为这是我第一次忘记它。所以,我添加了它。

class Metrics(_database.Model):



    __tablename__ = 'Metrics'
    _ID = _database.Column(_database.Integer, primary_key=True)
    _name = _database.Column(_database.String(45), nullable=False)
    _metric_type = _database.Column(_database.String(45))
    _host_metric_mapping = _database.relationship('HostMetricMapping', backref='_parent_metric', lazy=True)


    def __init__(self, name, metric_type):
        self._name = name # This line used to say self.name, but was changed to self._name to match the column name
        self._metric_type = metric_type # This line used to say self.metric_type, but was changed to self._metric_type to match the column name


    def __repr__(self):
        return '{0}'.format(self._ID)



class HostMetricMapping(_database.Model):



    __tablename__ = 'HostMetricMapping'
    _ID = _database.Column(_database.Integer, primary_key=True)
    _host_id = _database.Column(_database.Integer, _database.ForeignKey('Hosts._ID'), nullable=False)
    _metric_id = _database.Column(_database.Integer, _database.ForeignKey('Metrics._ID'), nullable=False)
    _metric = _database.relationship('MetricData', backref='_metric_hmm', lazy=True)
    _threshold = _database.relationship('ThresholdMapping', backref='_threshold_hmm', lazy=True)


    def __init__(self, host_id, metric_id):
        self._host_id = host_id # This line and it's corresponding parameter were missing, and were added
        self._metric_id = metric_id


    def __repr__(self):
        return '{0}'.format(self._ID)

我遇到的问题是:

  1. 当尝试实例化Metrics的实例并将其添加到数据库时,SQLAlchemy会引发IntegrityError,因为我将_name列设置为非{{1} },即使我使用两个参数的值实例化,SQLAlchemy都将null_name的值都继承为_metric_typeNone

  2. 对于HostMetricMapping,Python引发了一个异常,因为它仍然将该类视为仅具有NULL参数,而不是还具有我添加的metric_id参数。

1 个答案:

答案 0 :(得分:0)

使用flask-sqlalchemy时覆盖__init__的更好方法是使用reconstructor。使用sqlalchemy进行对象初始化有点棘手,而flask-sqlalchemy可能也会使其复杂化。无论如何,这是我们的操作方式:

from sqlalchemy.orm import reconstructor

class MyModel(db.Model):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.init_on_load()

    @reconstructor
    def init_on_load(self):
        # put your init stuff here