Как обновить таблицу с помощью SQLAlchemy с помощью python

#python #sql #sqlalchemy

#питон #sql #sqlalchemy

Вопрос:

Привет, я новичок в SQLAlchemy с использованием python. Я хочу обновить таблицу под названием Cars и хотел бы получить некоторые отзывы, если, возможно, есть другой способ обновления таблицы. Я не уверен, что функция execute() является хорошим способом обновления, поскольку она вызывает запрос. Я искал везде, но просто попытался выполнить простой запрос и обновить.

Вот график, которому я следую: введите описание изображения здесь

Вот мой код:

 from cars.models import Cars from cars.models import CarType from sqlalchemy.orm import session from sqlalchemy.sql.expression import update from sqlalchemy.sql.sqltypes import String, Text  # To update cars def update_cars_models(session):  db = session   try:  state = db.query(Cars).filter(Cars.state == "PRE_PROCESS")   for row in state.all():  if row.state == "PRE_PROCESS":   # To add CarType object data  car_update = CarType(1, "Subaru", "WHITE", "PRE_PROCESS")  db.add(car_update)  db.commit()   # To update Cars object  row.state = Cars.State.PROCESS #not sure if this how you use update  db.commit()   except SQLAlchemyError as error:  print(f"Error querying: {error}")   finally:  db.close()  if __name__ == "__main__":   # To update cars  update_cars_models(session)   

Ответ №1:

Вам не нужно запрашивать все строки, а затем редактировать каждую строку в цикле. В вашем коде показано, что вы хотите обновить те строки, состояние которых «PRE_PROCESS».

 car_update = { state = "PROCESS" } rows_updated = (db.session.query  .filter(Car.state == "PRE_PROCESS")  .update(car_update)  )  

Если вы хотите обновить строку для определенного идентификатора, вы можете написать «Car.id == 1» в фильтре

Комментарии:

1. Я прикрепил график, которому я следую, поэтому это состояние автомобиля должно быть обновлено для ОБРАБОТКИ после того, как состояние CarType находится в состоянии PRE_PROCESS, ваш блок .обновление(car_update) выведет триггер из цикла?

2. Вам не нужно иметь петлю. .Фильтр(Car.state == «PRE_PROCESS») получит все строки, состояние которых «PRE_PROCESS», и обновится до «PROCESS».

3. Хорошо, но CarType будет добавлен в базу данных, как только Cars будет находиться в режиме PRE_PROCESS, так что не был в цикле все равно будет работать?

4. ах, может быть, я могу присоединиться?