python - 如何在模型中使用 "on delete restrict"?

标签 python flask sqlalchemy

我已经弄清楚如何使用“on delete cascade”,但不清楚如何使用“on delete restrict”约束。我想要实现的是无法删除拥有 child 或 child 记录的 parent 。

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)
);

用“restrict”替换“delete”只允许我删除父行并保留孤立的行。

如何正确指定“限制”行为?

最佳答案

SQLite does not support foreign key constraints by default.它们必须在编译时启用并在运行时启用,否则它们将被静默忽略。

您可以通过在 sqlite shell 中运行 pragma foreign_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()

<子>来源:https://stackoverflow.com/a/15542046/400617


SQL foreign key cascades不同于 SQLAlchemy 的 relationship cascades (向下滚动第二个链接以查看两者的详细比较)。 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)

关于python - 如何在模型中使用 "on delete restrict"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27544808/

相关文章:

python - 如何实现更快的状态检查功能? Python

python - 拆分列表内的列表

python - "no python application found"uWSGI + nginx + Ubuntu 13

python - 与sqlmodel的一对一关系

Python SqlAlchemy + MySql 通过 JSON 列数据过滤

python - 使用 Python 连接 ElephantSQL

python - 在python vaex中删除重复的行

Flask-Assets 根本不工作... = 精神错乱

javascript - URL更改后附加内容消失

python - flask-sqlalchemy 对特定表使用 drop_all 和 create_all