我有
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)
。
尝试更多关系/外键的参数组合。
查看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()