我有两个特殊的模型类,这些类在测试过程中给我带来错误,在检查每种方法时,我确定我的问题是我输入错误的结果。
我已经根据需要在两个类中进行了更改,但是重新运行测试会产生相同的错误。我什至尝试删除我的架构并使用Flask-SQLAlchemy的create_all()
方法重新创建它,但仍然遇到问题。
在Metrics
类中,__init__
方法中的变量是错误的并且缺少下划线(即:self.name
而不是self._name
)。我通过将它们更改为self._name
和self._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)
我遇到的问题是:
当尝试实例化Metrics
的实例并将其添加到数据库时,SQLAlchemy会引发IntegrityError
,因为我将_name
列设置为非{{1} },即使我使用两个参数的值实例化,SQLAlchemy都将null
和_name
的值都继承为_metric_type
或None
。
对于HostMetricMapping,Python引发了一个异常,因为它仍然将该类视为仅具有NULL
参数,而不是还具有我添加的metric_id
参数。
答案 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