Я тестировал sqlalchemy в течение нескольких дней, и у меня возникли проблемы с использованием метода обновления в режиме ORM.
Что я в основном хочу сделать, это обновить таблицу из результата подзапроса, выполненного для второй таблицы.
Вот упрощенный пример:
from sqlalchemy import create_engine, Column, Integer, Float, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
Base = declarative_base()
engine = create_engine('postgresql+psycopg2://urldb', echo=True)
session = Session(engine)
class User1(Base):
__tablename__ = 'user1'
index = Column(Integer, primary_key=True)
value1 = Column(Float)
value2 = Column(Boolean)
class User2(Base):
__tablename__ = 'user2'
index = Column(Integer, primary_key=True)
value1 = Column(Float)
value2 = Column(Boolean)
try:
User1.__table__.drop(engine)
User2.__table__.drop(engine)
Base.metadata.create_all(engine)
except:
Base.metadata.create_all(engine)
user1 = User1(value1=12, value2=True)
user2 = User1(value1=15, value2=True)
user3 = User1(value1=7, value2=True)
user4 = User2(value1=12, value2=True)
user5 = User2(value1=15, value2=False)
session.add(user1)
session.add(user2)
session.add(user3)
session.add(user4)
session.add(user5)
session.flush()
session.commit()
stmt = session.query(User2).filter(User2.value1 > 12).subquery()
session.query(User1).filter(User1.value1 == stmt.c.value1).update({User1.value2 : stmt.c.value2})
session.commit()
Я ожидаю, что value2
из user2
будет обновлено до False
, что этот код делает правильно. Тем не менее, я получаю следующее предупреждение. Насколько я понимаю, обновление будет ожидать некоторого ORM-подобного выражения вместо stmt.c. Но я не вижу, как преобразовать мой объект stmt в объект ORM (пробовал псевдоним User1, но не получилось, я понял почему потом ...).
Есть идеи обойти это предупреждение? Заранее спасибо!
/ Библиотека / Каркасы / Python.framework / Версии / 3.6 / lib / python3.6 / site-packages / sqlalchemy / orm /valuator.py: 71: SAWarning: Оценка выражения не сопоставленного столбца '% (4357770376 anon) s.value1 'на экземпляры ORM; это устаревший вариант использования. Пожалуйста, используйте фактические сопоставленные столбцы в выражениях UPDATE / DELETE, оцененных ORM.
"ОБНОВИТЬ / УДАЛИТЬ выражения." % пункт)
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/evaluator.py:71: SAWarning: оценка не сопоставленного выражения столбца '% (4357770376 anon) s.value2 'на экземпляры ORM; это устаревший вариант использования. Пожалуйста, используйте фактические сопоставленные столбцы в выражениях UPDATE / DELETE, оцененных ORM.
"ОБНОВИТЬ / УДАЛИТЬ выражения." % пункт)