Как сделать влево присоединиться к обновлению с SQLALCHEMY и MYSQL?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как сделать влево присоединиться к обновлению с SQLALCHEMY и MYSQL?

Сообщение Anonymous »

Я пытаюсь создать запрос с помощью SQLalchemy 2.5. Моя главная цель - сделать обновление, в то время как: < /p>

Соединение на таблице «родитель» < /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)

В словах, SQL, который я пытаюсь генерировать,-это похоже на (мне известно о возможности использовать Text () и необработанный SQL, но я хотел бы сделать эту работу с ORM):

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»