SQLAlchemy 删除不会级联 SQLite

问题描述 投票:0回答:1

我有

user
模型和
computers
模型。

from sqlalchemy import create_engine
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column


engine = create_engine(
    "sqlite:///./database.db",
    echo=True,
)
Session = sessionmaker(bind=engine)
Base = declarative_base()

class UserOrm(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    name: Mapped[str] = mapped_column(nullable=True, default="")
    age: Mapped[int] = mapped_column(nullable=True, default=0)
    computers = relationship(
        "ComputerOrm",
        back_populates="host",
        cascade="all, delete",
        passive_deletes=True,
    )


class ComputerOrm(Base):
    __tablename__ = "computers"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    name: Mapped[str]
    host_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), index=True, nullable=False)
    host = relationship(UserOrm, back_populates="computers")

Base.metadata.create_all(engine)

如果我执行代码:

with Session() as session:
    session.query(UserOrm).filter_by(id=some_id).delete()
    session.commit()

用户已删除,但用户的计算机未删除。

SQLAlchemy 回显:

2023-12-23 17:12:21,384 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-12-23 17:12:21,390 INFO sqlalchemy.engine.Engine DELETE FROM users WHERE users.id = ?
2023-12-23 17:12:21,392 INFO sqlalchemy.engine.Engine [generated in 0.00172s] (1,)

如果我在

DB Browser for SQLite
中执行 SQL 脚本,一切正常。用户和用户的计算机已删除。

DELETE FROM users WHERE users.id = some_id;

SQL建表脚本,由SQLAlchemy生成:

CREATE TABLE users (
    id INTEGER NOT NULL, 
    name VARCHAR, 
    age INTEGER, 
    PRIMARY KEY (id)
)

CREATE TABLE computers (
    id INTEGER NOT NULL, 
    name VARCHAR NOT NULL, 
    host_id INTEGER NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY(host_id) REFERENCES users (id) ON DELETE CASCADE
)

如何解决问题?

$ pip show sqlalchemy
Name: SQLAlchemy
Version: 2.0.23
...

python 3.12.1

SQLite 3.35.5

Windows 10 专业版 22H2 64 位

我做了什么

检查创建表脚本。

尝试从

SQLAlchemy
echo 到
DB Browser for SQLite
执行 SQL 脚本。

尝试更多解决方案来解决我的问题。

尝试

session.delete(user_orm)

尝试更多关系/外键的参数组合。

https://docs.sqlalchemy.org/en/20/orm/cascades.html#using-foreign-key-on-delete-cascade-with-orm-relationships

python sql sqlite sqlalchemy one-to-many
1个回答
0
投票

查看SQLAlchemy文档,如何打开foreign_keys:

from sqlalchemy.engine import Engine
from sqlalchemy import event

@event.listens_for(Engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
    cursor = dbapi_connection.cursor()
    cursor.execute("PRAGMA foreign_keys=ON")
    cursor.close()
© www.soinside.com 2019 - 2024. All rights reserved.