Dun*_*ogh 4 python sqlalchemy flask
我已经想出如何使用"删除级联",但不清楚如何做"删除限制"约束.我想要实现的是无法删除具有子记录或子记录的父级.
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)
);
Run Code Online (Sandbox Code Playgroud)
用"restrict"替换"delete"只允许我删除父项并保留孤立的行.
如何正确指定"限制"行为?
默认情况下,SQLite不支持外键约束. 必须在编译时启用它们并在运行时启用它们,否则它们将被静默忽略.
您可以通过pragma foreign_keys在sqlite shell中运行来检查是否启用了外键.如果返回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()
Run Code Online (Sandbox Code Playgroud)
来源:https://stackoverflow.com/a/15542046/400617
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1257 次 |
| 最近记录: |