Python “怎么可能?”;关于删除“限制”;在模型中使用?

Python “怎么可能?”;关于删除“限制”;在模型中使用?,python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我已经知道如何使用“on delete cascade”,但不清楚如何使用“on delete restrict”约束。我希望实现的是不能删除具有一个或多个子女记录的家长 class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) fullname = db.Column(db.String) password = db.Column(

我已经知道如何使用“on delete cascade”,但不清楚如何使用“on delete restrict”约束。我希望实现的是不能删除具有一个或多个子女记录的家长

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    fullname = db.Column(db.String)
    password = db.Column(db.String)

    posts = db.relationship("Post", backref='user', cascade="all, delete, delete-orphan")

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String, nullable=False)
    description = db.Column(db.String, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id', onupdate="CASCADE", ondelete="CASCADE"))

CREATE TABLE posts (
    id INTEGER NOT NULL,
    title VARCHAR NOT NULL,
    description VARCHAR NOT NULL,
    user_id INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE RESTRICT ON UPDATE CASCADE
);

CREATE TABLE users (
    id INTEGER NOT NULL,
    name VARCHAR,
    fullname VARCHAR,
    password VARCHAR,
    PRIMARY KEY (id)
);
将“delete”替换为“restrict”只允许我删除父行并保留孤立行

如何正确指定“restrict”行为?

它们必须在编译时启用,在运行时启用,否则将被静默忽略

您可以通过在sqlite shell中运行
pragma-foreign\u-keys
来检查是否启用了外键。如果返回1,则启用它们。如果返回0,则禁用它们。如果它不返回任何内容,则不支持它们,必须重新编译sqlite以支持它们

如果禁用外键,则可以指示SQLAlchemy在创建连接时启用它们

from sqlalchemy import event
from sqlalchemy.engine import Engine
from sqlite3 import Connection as SQLite3Connection

@event.listens_for(Engine, "connect")
def _set_sqlite_pragma(dbapi_connection, connection_record):
    if isinstance(dbapi_connection, SQLite3Connection):
        cursor = dbapi_connection.cursor()
        cursor.execute("PRAGMA foreign_keys=ON;")
        cursor.close()
资料来源:


SQL不同于SQLAlchemy(向下滚动第二个链接以查看两者的详细比较)。SQLAlchemy没有“限制”级联。您应该在外键上指定。如果更改已存在的外键,请确保重新创建/迁移数据库

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey(User.id, ondelete='RESTRICT'), nullable=False)