Python SQLAlchemy ORM: обновить строку с экземпляром класса - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь создать функцию для обновления строк в базе данных на основе экземпляра класса.

В основном я хотел бы сделать что-то вроде этого:

def update_table(self, result):
    session = self.Session()

    session.query(result.__class__).filter_by(id=result.id).update(result)

    session.commit()
    session.close_all()


user = db.Model.User(
  id = 1,
  name = "foo"
)

# Store user to db
db.save(user)

updated_user = db.Model.User(
    id = 1,
    user = "bar"
)

# Update the users name with id=1
update_table(updated_user)

Проблема в c в том, что запрос сеанса приводит к

TypeError: объект 'User' не повторяется

но, на мой взгляд, это должно закончиться с обновленным пользователем с именем = "bar".

Есть ли способ создать такую ​​функцию с помощью SQLAlchemy ORM?

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Я получил это решение:

# Update single entry
def update_table_by_id(self, entry):
    # Open connection to database
    session = self.Session()

    # Fetch entry from database
    db_result = session.query(entry.__class__).filter_by(id=entry.id)

    # Convert Models to dicts
    entry_dict = entry.as_dict()
    db_result_dict = db_result.first().as_dict()

    # Update database result with passed in entry. Skip of None
    for value in entry_dict:
        if entry_dict[value] is not None:
            db_result_dict[value] = entry_dict[value]

    # Update db and close connections
    db_result.update(db_result_dict)
    session.commit()
    session.close_all()

Это позволяет мне отправлять произвольные модели, и все они обрабатываются одинаково.

Предложения и улучшения приветствуются!

0 голосов
/ 05 марта 2020

Вам не нужна дополнительная процедура обновления ...

user = db.Model.User(
  id = 1,
  name = "foo"
)

# Store user to db
db.save(user)

new_user = session.query(User).filter(User.id==1).first()
new_user.name = "bar"
session.commit()
...