Код: Выделить всё
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()
Я нашел пару решений. Например, в каждом возрасте сгенерируйте новый объект-человек, представляющий Сьюзан конкретно в этом возрасте, добавьте его в сеанс, затем проигнорируйте его и создайте новый объект на следующий год. Также есть решения, включающие класс для хранения только записанных данных, и это один из них, который создается каждый раз, когда фиксируется шаг.
Оба из них кажутся излишне неэлегантными; Я хочу просто изменить атрибуты объекта Сьюзен, зарегистрировать текущее состояние, а затем продолжать вносить изменения, пока не захочу снова войти в систему, и так далее. У меня нет отличного понимания SQLAlchemy, и из-за трудностей, с которыми я столкнулся, мне пришло в голову, что это может фундаментально противоречить тому, как устроен SQLAlchemy, и если да, то почему? Это кажется вполне естественным, что вы, возможно, захотите сделать, и возможно ли это, или есть ли какие-либо другие библиотеки, которые лучше подходят для этого?
Подробнее здесь: https://stackoverflow.com/questions/787 ... sqlalchemy