Не могу понять, как написать заявление об обновлении в sqlalchemy ORM - PullRequest
0 голосов
/ 29 марта 2019

Я не могу написать этот оператор SQL с sqlalchemy ORM в базе данных postgresql:

update "DisappearanceRange"
  set vehicle_status_stop_id = vs_id from (
    select id as vs_id, vehicle_id as vs_vehicle_id from "VehicleStatus"
     where timestamp = to_timestamp('2019-03-25 13:02:49.042646', 'YYYY-MM-DD HH24:MI:SS.US')
  ) vs_last_timestamp
where vehicle_status_stop_id is null
      and vehicle_provider = 'TIER'
      and vehicle_id = vs_vehicle_id;

Я делаю это прямо сейчас:

subquery = self.db_session.query(
    VehicleStatus.id.label('vs_id'),
    VehicleStatus.vehicle_id.label('vehicle_id')).filter(
        VehicleStatus.timestamp == timestamp).subquery()

self.db_session.query(DisappearanceRange).filter(
    DisappearanceRange.vehicle_provider == self.PROVIDER_ENUM,
    DisappearanceRange.vehicle_status_stop_id.is_(None),
    DisappearanceRange.vehicle_id == subquery.c.vehicle_id
).update({'vehicle_status_stop_id': subquery.c.vs_id})

Я думаю, я простоне знаю, как обновить из подзапроса.Когда я это сделаю, я получу: sawarning: Evaluating non-mapped column expression.

Я мог бы написать это без ORM, но я хотел бы соответствовать остальному моему коду.

Я нашел связанный post но он не дал хорошего ответа.

Это мои занятия:

class Vehicle(Base):
    __tablename__ = 'Vehicle'

    id = Column(String(150), primary_key=True)
    provider = Column(Enum(ProviderEnum), primary_key=True)
    type = Column(Enum(VehicleTypeEnum), nullable=False)


class VehicleStatus(Base):
    __tablename__ = 'VehicleStatus'

    id = Column(Integer, primary_key=True)
    vehicle_id = Column(String(150), nullable=False)
    vehicle_provider = Column(Enum(ProviderEnum), nullable=False)
    __table_args__ = (ForeignKeyConstraint(['vehicle_id', 'vehicle_provider'],
                                           ['Vehicle.id', 'Vehicle.provider']),
                      {})
    latitude = Column(Float, nullable=False)
    longitude = Column(Float, nullable=False)
    energy_level = Column(Float, nullable=False)
    provider_specific = Column(JSON, nullable=False)
    timestamp = Column(TIMESTAMP, nullable=False, index=True)


class DisappearanceRange(Base):
    __tablename__ = 'DisappearanceRange'

    id = Column(Integer, primary_key=True)
    vehicle_id = Column(String(150))
    vehicle_provider = Column(Enum(ProviderEnum))
    __table_args__ = (ForeignKeyConstraint(['vehicle_id', 'vehicle_provider'],
                                           ['Vehicle.id', 'Vehicle.provider']),
                      {})
    vehicle_status_start_id = Column(Integer, ForeignKey('VehicleStatus.id'))
    vehicle_status_stop_id = Column(Integer, ForeignKey('VehicleStatus.id'),
                                    nullable=True)

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