首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Onupdate=“层叠”什么也不做

Onupdate=“层叠”什么也不做
EN

Stack Overflow用户
提问于 2016-04-08 21:54:10
回答 1查看 103关注 0票数 0

尝试使用onupdate="CASCADE",但未应用级联。以LeadLeadStatus模型为例,其中Lead.status_id上需要级联

代码语言:javascript
复制
# -*- coding: utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'
app.config['DEBUG'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = False
db = SQLAlchemy(app)

class Lead(db.Model):
    __tablename__ = 'lead'

    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(1024), nullable=False, server_default='')
    status_id = db.Column(db.String(16), db.ForeignKey('lead_status.id', onupdate='CASCADE'))
    status = db.relationship('LeadStatus', back_populates='leads')


class LeadStatus(db.Model):
    __tablename__ = 'lead_status'

    id = db.Column(db.String(16), primary_key=True)
    leads = db.relationship('Lead', back_populates='status')


def print_trace(lead_status, lead):
    print('DEBUG: status.id is {0}'.format(lead_status.id))
    print('DEBUG: {0}.status_id is {1}'.format(lead.name, lead.status_id))


if __name__ == '__main__':
    db.create_all()

    lead_status = LeadStatus(id='new')
    lead = Lead(name='Foo', status=lead_status)

    db.session.add(lead_status)
    db.session.add(lead)
    db.session.commit()

    # debug
    print_trace(lead_status, lead)

    lead_status = db.session.query(LeadStatus).filter(LeadStatus.id == 'new').one()
    lead = db.session.query(Lead).filter(Lead.name == 'Foo').one()

    lead_status.id = 'new_renamed'
    # db.session.delete(lead_status)
    db.session.commit()

    # debug
    print_trace(lead_status, lead)

    # lead_status = db.session.query(LeadStatus).filter(LeadStatus.id == 'new_renamed').one()
    lead = db.session.query(Lead).filter(Lead.name == 'Foo').one()

    # debug
    print_trace(lead_status, lead)

代码生成:

代码语言:javascript
复制
DEBUG: status.id is new
DEBUG: Foo.status_id is new
DEBUG: status.id is new_renamed
DEBUG: Foo.status_id is new
DEBUG: status.id is new_renamed
DEBUG: Foo.status_id is new

make onupdate="CASCADE"是如何工作的?

EN

回答 1

Stack Overflow用户

发布于 2016-04-08 21:55:13

SQLite默认禁用密钥使用,请参阅https://www.sqlite.org/foreignkeys.html#fk_enable。您必须激活它们:

代码语言:javascript
复制
db.session.execute('PRAGMA foreign_keys = ON')

立即生成代码:

代码语言:javascript
复制
DEBUG: status.id is new
DEBUG: Foo.status_id is new
DEBUG: status.id is new_renamed
DEBUG: Foo.status_id is new_renamed
DEBUG: status.id is new_renamed
DEBUG: Foo.status_id is new_renamed
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36501433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档