Обновление строки в SqlAlchemy ORM

Я пытаюсь получить строку из БД, изменить эту строку и сохранить ее снова.
Все, используя SqlAlchemy

Мой код

from sqlalchemy import Column, DateTime, Integer, String, Table, MetaData from sqlalchemy.orm import mapper from sqlalchemy import create_engine, orm metadata = MetaData() product = Table('product', metadata, Column('id', Integer, primary_key=True), Column('name', String(1024), nullable=False, unique=True), ) class Product(object): def __init__(self, id, name): self.id = id self.name = name mapper(Product, product) db = create_engine('sqlite:////' + db_path) sm = orm.sessionmaker(bind=db, autoflush=True, autocommit=True, expire_on_commit=True) session = orm.scoped_session(sm) result = session.execute("select * from product where id = :id", {'id': 1}, mapper=Product) prod = result.fetchone() #there are many products in db so query is ok prod.name = 'test' #<- here I got AttributeError: 'RowProxy' object has no attribute 'name' session .add(prod) session .flush() 

К сожалению, это не работает, потому что я пытаюсь изменить объект RowProxy. Как я могу сделать то, что хочу (загрузить, изменить и сохранить (обновить) строку) в ORM-методе SqlAlchemy?

One Solution collect form web for “Обновление строки в SqlAlchemy ORM”

Я предполагаю, что вы намерены использовать Object-Relational API . Поэтому, чтобы обновить строку в db, вам нужно сделать это, загрузив сопоставленный объект из записи таблицы и обновив свойство объекта.

См. Пример кода ниже. Обратите внимание, что я добавил примерный код для создания нового сопоставленного объекта и создания первой записи в таблице, и в конце кода прокомментирован код для удаления записи.

 from sqlalchemy import Column, DateTime, Integer, String, Table, MetaData from sqlalchemy.orm import mapper from sqlalchemy import create_engine, orm metadata = MetaData() product = Table('product', metadata, Column('id', Integer, primary_key=True), Column('name', String(1024), nullable=False, unique=True), ) class Product(object): def __init__(self, id, name): self.id = id self.name = name def __repr__(self): return "%s(%r,%r)" % (self.__class__.name,self.id,self.name) mapper(Product, product) db = create_engine('sqlite:////temp/test123.db') metadata.create_all(db) sm = orm.sessionmaker(bind=db, autoflush=True, autocommit=True, expire_on_commit=True) session = orm.scoped_session(sm) #create new Product record: if session.query(Product).filter(Product.id==1).count()==0: new_prod = Product("1","Product1") print "Creating new product: %r" % new_prod session.add(new_prod) session.flush() else: print "product with id 1 already exists: %r" % session.query(Product).filter(Product.id==1).one() print "loading Product with id=1" prod = session.query(Product).filter(Product.id==1).one() print "current name: %s" % prod.name prod.name = "new name" print prod prod.name = 'test' session.add(prod) session.flush() print prod #session.delete(prod) #session.flush() 

PS SQLAlchemy также предоставляет SQL Expression API, который позволяет напрямую работать с табличными записями без создания сопоставленных объектов. В моей практике мы используем API Object-Relation в большинстве приложений, иногда мы используем SQL Expressions API, когда нам нужно выполнять операции с низким уровнем db эффективно, например, вставлять или обновлять тысячи записей одним запросом.

Прямые ссылки на документацию SQLAlchemy:

  • Реляционное учебное пособие по объектам
  • Учебник по языку SQL Expression
  • Недостаток метакласса SqlAlchemy
  • Может ли SQLAlchemy быть настроен на неблокирование?
  • Сравнение дат с SQLAlchemy, SQLite
  • Является ли SQLAlchemy по-прежнему рекомендуемым, если он используется только для сырого SQL-запроса?
  • SQLALchemy От многих до многих конфигураций отношений модели с полиморфными моделями
  • Как обернуть столбец в операции CAST
  • добавить столбец в таблицу SQLAlchemy
  • Вложенные транзакции с SQLAlchemy и sqlite
  • Как использовать avg и sum в запросе SQLAlchemy
  • Как автоматически отражать базу данных в sqlalchemy декларативной?
  • SQLAlchemy протоколирование изменений с датой и пользователем
  • Python - лучший язык программирования в мире.