Можно ли регистрировать несколько состояний одного и того же объекта с помощью SQLAlchemy?Python

Программы на Python
Anonymous
Можно ли регистрировать несколько состояний одного и того же объекта с помощью SQLAlchemy?

Сообщение Anonymous »

Я пытаюсь использовать SQLAlchemy для многократного протоколирования того, что происходит с одним объектом. Ниже приведен пример кода, который демонстрирует мою цель.

Код: Выделить всё

from sqlalchemy.orm import session maker, declarative_base, Mapped, mapped_column
from sqlalchemy import create_engine, String, Integer
from random import randint
Base = declaritive_base()
class Person(Base):
__tablename__ = 'people'
id: Mapped[int] = mapped_column(Integer, primary_key=True, auto increment=True)
name: Mapped[str] = mapped_column(String)
age: Mapped[int] = mapped_column(Integer)
favorite_color: Mapped[str] = mapped_column(String)

def __init__(self, name, favorite_color):
self.name = name
self.age = 0
self.favorite_color = favorite_color

def change_favorite_color(self):
colors = ['blue', 'red', 'green']
self.favorite_color = colors[randint(0, 2)]

def increase_age(self):
self.age += 1

engine = create_engine('sqlite:///mydb.db', echo=False)
Base.metadata.drop_all(bind=engine)
Base.metadata.create_all(bind=engine)

Session = session maker(bind=engine)
session = Session()

susan = Person('Susan', 'pink')
for i in range(50):
session.add(susan)
session.commit()
susan.increase_age()
if susan.age % 5 == 0:
susan.change_favorite_color()

После того, как я закончу, я хотел бы иметь журнал того, какой любимый цвет был у Сьюзен в каждом возрасте. В настоящее время я знаю только ее последний любимый цвет, когда ей исполнится 49 лет.
Я нашел пару решений. Например, в каждом возрасте сгенерируйте новый объект-человек, представляющий Сьюзан конкретно в этом возрасте, добавьте его в сеанс, затем проигнорируйте его и создайте новый объект на следующий год. Также есть решения, включающие класс для хранения только записанных данных, и это один из них, который создается каждый раз, когда фиксируется шаг.
Оба из них кажутся излишне неэлегантными; Я хочу просто изменить атрибуты объекта Сьюзен, зарегистрировать текущее состояние, а затем продолжать вносить изменения, пока не захочу снова войти в систему, и так далее. У меня нет отличного понимания SQLAlchemy, и из-за трудностей, с которыми я столкнулся, мне пришло в голову, что это может фундаментально противоречить тому, как устроен SQLAlchemy, и если да, то почему? Это кажется вполне естественным, что вы, возможно, захотите сделать, и возможно ли это, или есть ли какие-либо другие библиотеки, которые лучше подходят для этого?

Подробнее здесь: https://stackoverflow.com/questions/787 ... sqlalchemy

Вернуться в «Python»