Eso*_*oid 1 python sqlalchemy flask-sqlalchemy
我一直在这个问题上停留,我不知道如何解决它。这是我的models.py文件:
class TripDetail(db.Model):
"""
Base class for every table that contains info about a trip.
"""
__abstract__ = True
__bind_key__ = 'instructions'
id = db.Column(db.Integer, primary_key=True)
# list of fields
class Overview(TripDetail):
"""
Class that contains general information about a trip.
"""
__tablename__ = 'overviews'
__table_args__ = (
db.ForeignKeyConstraint(['user_id', 'calendar_id'], ['calendars.user_id', 'calendars.id'], ondelete='CASCADE'),
) # constraints on other tables, omitted here
user_id = db.Column(db.Integer, primary_key=True)
calendar_id = db.Column(db.Integer, primary_key=True)
calendar = db.relationship('Calendar', backref=db.backref('overviews', cascade='delete'), passive_deletes=True)
# other fields
class Step(TripDetail):
__tablename__ = 'steps'
overview_id = db.Column(db.Integer, db.ForeignKey('overviews.id', ondelete='CASCADE'))
overview = db.relationship('Overview', backref=db.backref('steps', cascade='delete'), passive_deletes=True)
# also other fields
Run Code Online (Sandbox Code Playgroud)
这就是我向数据库中添加项目的方式(响应参数包含与类匹配的字典,可以直接将其解压缩):
def add_instruction(response):
"""
Adds a travel instruction to the database.
"""
steps = response.pop('steps')
overview = Overview(**response)
for step in steps:
Step(overview=overview, **step)
db.session.add(overview)
db.session.commit()
logger.info(f"Stored instruction with PK {(overview.id, overview.user_id, overview.calendar_id, overview.event_id)}")
Run Code Online (Sandbox Code Playgroud)
现在,该overviews表已正确填充,但steps保持为空。检查日志,我收到以下警告:
SAWarning:类型不在会话中的对象,沿着“ Overview.steps”添加操作将不会继续(orm_util.state_class_str(state),operation,prop)
我究竟做错了什么?
通常,在将add()对象加入会话时,它们的相关对象将按照您的需要自动添加。该行为受关系的控制cascade。
设置cascade为'delete'in Steps.overview会删除默认设置'save-update',它会打开自动添加功能。您可以仅使用添加回去cascade='save-update, delete',然后查看可能的特征并查看您可能还需要什么。一个常见的集合是'all, delete-orphan'。
并记住这些严格是ORM行为;'delete'在级联中设置a 不会设置列的ON [event] CASCADE。
| 归档时间: |
|
| 查看次数: |
605 次 |
| 最近记录: |