Соединение на таблице «родитель» < /li>
И делать левое соединение между таблицей «родитель» и третьей таблицей < /li>
< /ul>
Я не могу сделать это работа: у меня всегда есть либо ошибки или карты. Несколько вариантов. В настоящее время я стараюсь с подпрограммой, но получаю картезианский продукт: < /p>
Код: Выделить всё
from sqlalchemy import (
DateTime,
ForeignKey,
Integer,
create_engine,
func,
select,
update,
)
from sqlalchemy.orm import DeclarativeBase, mapped_column, sessionmaker
###########
# MODELS #
###########
class Base(DeclarativeBase):
pass
class Parent(Base):
__tablename__ = "parent"
id = mapped_column(Integer, primary_key=True, nullable=False)
updated_at = mapped_column(DateTime, nullable=True)
class Child(Base):
__tablename__ = "child"
id = mapped_column(Integer, primary_key=True, nullable=False)
parent_id = mapped_column(Integer, ForeignKey("parent.id"))
last_status_change = mapped_column(DateTime, nullable=True)
class OtherChild(Base):
__tablename__ = "other_child"
id = mapped_column(Integer, primary_key=True, nullable=False)
parent_id = mapped_column(Integer, ForeignKey("parent.id"))
###########
# DB INIT #
###########
engine = create_engine("mysql://root:@127.0.0.1/dev?charset=utf8mb4")
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
###########
# EXAMPLE #
###########
subq = (
select(Parent.id, Parent.updated_at)
.outerjoin(OtherChild)
.where(OtherChild.id.is_(None))
).subquery()
stmt = (
update(Child)
.where(Child.parent_id.in_(select(subq.c.id)))
.values(
last_status_change=func.CONVERT_TZ(subq.c.updated_at, "Europe/Paris", "UTC")
)
)
compiled = stmt.compile(dialect=engine.dialect, compile_kwargs={"literal_binds": True})
# print(compiled)
with Session() as session:
session.execute(stmt)
Код: Выделить всё
UPDATE
child
JOIN parent ON
parent.id = child.parent_id
LEFT JOIN other_child ON
other_child.parent_id = parent.id
SET
last_status_change = CONVERT_TZ(parent.updated_at, 'Europe/Paris', 'UTC')
WHERE
other_child.id IS NULL
Подробнее здесь: https://stackoverflow.com/questions/797 ... -and-mysql