Вызвав MetaData.reflect
, вы попросили SQLAlchemy автоматически определить объекты Table
, описывающие вашу базу данных.Вы можете использовать эти объекты для создания SQL-запросов, не зависящих от языка, таких как
engine.execute(update(mt).where(mt.c.id==1).values(usercomment='Hello World'))
Однако вы пока не можете использовать объекты Table
для правильного ORM.Когда вы запрашиваете объект Table
(через session.query(mt)
), вы получаете результаты, возвращаемые вам как namedtuple
-подобные объекты, доступные только для чтения.Установка их атрибутов не имеет смысла, поэтому вы наблюдаете исключение.
Чтобы использовать реальный ORM, вам нужно создать соответствующие классы ORM и сопоставить их с Table
объектами.
КонечноВы можете попросить SQLAlchemy автоматически отразить для вас классы ORM вместе с таблицами, используя automap .Вот код, который вы, вероятно, хотели написать:
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
# Ask SQLAlchemy to reflect the tables and
# create the corresponding ORM classes:
Base = automap_base()
Base.prepare(amEngine, reflect=True)
# This is the ORM class we are interested in:
MailTable = Base.classes.mailtable
# Create the session, query, update and commit:
Session = sessionmaker(bind=amEngine)
session = Session()
mailRow = session.query(MailTable).get(mailId)
mailAddress = mailRow.address
mailRow.usercomment = 'Hello World'
session.commit()