Обновление строки в 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
  • ImportError: нет модуля с именем sqlalchemy
  • SQLAlchemy DateTime часовой пояс
  • Циркулярный импорт модели SQLAlchemy
  • sqlalchemy существует для запроса
  • Получить связанные модели в SQLAlchemy
  • Таблица сопоставления SQLAlchemy с столбцами non-ascii для класса
  • хранимые процедуры с sqlAlchemy
  • Как моделировать ограничение `UNIQUE` в SQLAlchemy?
  •  
    Interesting Posts for Van-Lav

    Как проверить, работает ли redis до того, как я запустил флягу (и запустил ее, если это не так)?

    Символ поддерживает движение только при движении мыши на экране?

    python Socket.IO-клиент для отправки широковещательных сообщений на сервер TornadIO2

    Функции задач сельдерея – веб-сервер и удаленный сервер

    Matplotlib: как установить текущий показатель?

    Использование оператора «==» для трех объектов

    Интеграция не увенчалась успехом в Python QuTiP

    Флажок, перенаправляющий несколько маршрутов

    как я могу получить целое число, используя python, если еще условно

    Элегантный и быстрый способ последовательного перебора двух или более контейнеров в Python?

    Как вызвать MATLAB для Python для кластера?

    Почему отсортированный список больше, чем несортированный список

    Текстовый генератор текста в ASCII в Python

    Пип с Python 2.7 и 3.4 на Windows-машине

    Функция для сопоставления значений в нескольких столбцах

    Python - лучший язык программирования в мире.