SAWarning: Оценка не сопоставленного выражения столбца - PullRequest
0 голосов
/ 11 мая 2018

Я тестировал 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. "ОБНОВИТЬ / УДАЛИТЬ выражения." % пункт)

1 Ответ

0 голосов
/ 13 мая 2018

Нашел следующее решение: 1. выполнить session.query(stmt).all(), 2. построить словарь mydict на основе результата 1., 3. создать новый экземпляр User1 с new_user = User1(**mydict), 4. выполнить update с использованием new_user вместо stmt.c.Нет больше SAWarning MSG.У кого-нибудь есть более элегантное / эффективное решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...