【问题标题】:SQLAlchemy expression language and SQLite's on delete cascadeSQLAlchemy 表达式语言和 SQLite 的删除级联
【发布时间】:2020-01-03 16:00:48
【问题描述】:

我有两个关联表usersroles,它们之间的关系是多对多的,所以还存在另一个关联表userroles

userroles 表使用外键跟踪关联的 usersroles 行。对于外键,ondelete 参数设置为"CASCADE",以便在删除任何关联元素时删除关联行。

这是我的设置:

import sqlalchemy as sa


engine = sa.create_engine("sqlite:///:memory:", echo=True)
metadata = sa.MetaData()


userroles = sa.Table(
    "userroles",
    metadata,
    sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE")),
    sa.Column("role_id", sa.Integer, sa.ForeignKey("roles.id", ondelete="CASCADE")),
)


users = sa.Table(
    "users",
    metadata,
    sa.Column("id", sa.Integer, primary_key=True),
    sa.Column("name", sa.String),
)


roles = sa.Table(
    "roles",
    metadata,
    sa.Column("id", sa.Integer, primary_key=True),
    sa.Column("name", sa.String),
)

metadata.create_all(engine)
conn = engine.connect()

conn.execute(users.insert().values(name="Joe"))
conn.execute(roles.insert().values(name="Admin"))
conn.execute(roles.insert().values(name="User"))
conn.execute(userroles.insert().values(user_id=1, role_id=1))

但是,当我删除唯一 ID 为 1Admin 角色时,关联的行不会从 userroles 表中删除。为什么?

我在这里错过了什么?

【问题讨论】:

标签: python-3.x sqlite sqlalchemy


【解决方案1】:

好的,您似乎需要为 sqlite 强制执行外键。所以基于这个answer 应该这样做:

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

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多