Отключение фиксации изменений объекта в SQLAlchemy

Я использую SQLAlchemy в проекте, который не является веб-приложением. Это серверное приложение, которое загружает несколько разных объектов из базы данных и изменяет их локально, но не хочет сохранять эти обновления в базе данных каждый раз, когда выдается фиксация. Ранее я работал с Django ORM для некоторых веб-проектов и нашел, что он лучше подходит для того, чего я пытаюсь достичь. В Django ORM я мог бы .save () каждый объект, когда захочу, без сохранения других вещей, которые я, возможно, не хочу сохранять. Я понимаю, почему это работает в SQLAlchemy, но мне интересно, как я мог бы сделать это в стиле Django?


Обновление. Чтобы было легче понять, чего я пытаюсь достичь, я приведу вам пример.

Вот как это работает на самом деле:

a = MyModel.query.get(1) b = MyModel.query.get(1) a.somefield = 1 b.somefield = 2 # this will save both of changed models session.commit() 

Вот как я хочу, чтобы он работал:

 a = MyModel.query.get(1) b = MyModel.query.get(1) a.somefield = 1 b.somefield = 2 a.save() # I didn't want to save b, changes of b weren't committed 

Я хочу иметь больший контроль над тем, что фактически спасено. Я хочу сохранить изменения каждого объекта каждые 5 минут или около того.

3 Solutions collect form web for “Отключение фиксации изменений объекта в SQLAlchemy”

Я использую что-то вроде:

 class BaseModel(object): def save(self, commit=True): # this part can be optimized. try: db.session.add(self) except FlushError: # In case of an update operation. pass if commit: db.session.commit() def delete(self, commit=True): db.session.delete(self) if commit: db.session.commit() 

и затем я определяю свои модели как:

 class User(db.Model, BaseModel) 

Итак, теперь я могу сделать:

 u = User(username='foo', password='bar') u.save() 

Это то, чего вы планировали достичь?

Я не уверен, что понимаю ваше затруднительное положение.

В Джанго,

 foo = MyModel(field1='value1', field2='value2') foo.save() 

или альтернативно

 foo = MyModel.objects.create(field1='value1', field2='value2') 

В SQLAlchemy,

 foo = MyModel(field1='value1', field2='value2') session.add(foo) 

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

 session.commit() 

взгляните, что эта ссылка . Я думаю, что это упростит переход от Django ORM к SqlAlchemy.

ОБНОВИТЬ

Для такой ситуации вы можете использовать несколько сеансов.

 engine = create_engine("postgresql+psycopg2://user:password@localhost/test") metadata = MetaData(bind=engine) Session = sessionmaker(bind=engine) session1 = Session() session2 = Session() Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) age = Column(Integer) def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return "<User('%s','%s')>" % (self.name, self.age) Base.metadata.create_all(engine) 

Создал таблицу «пользователей» в «test» db. Также были инициализированы 2 объекта сеанса, session1 и session2.

 a = User('foo','10') b = User('bar', '20') session1.add(a) session1.add(b) session1.commit() 

Теперь пользователи таблицы будут иметь 2 записи

 1: foo, 10 2: bar, 20 

Извлечение записи «foo» sing session1 и «bar» с использованием session2.

 foo = session1.query(User).filter(User.name == "foo").first() bar = session2.query(User).filter(User.name == "bar").first() 

Внесение изменений в 2 записи

 foo.age = 11 bar.age = 21 

Теперь, если вы хотите, чтобы изменения только одного foo переносились,

 session1.commit() 

и для бара,

 session2.commit() 

Не возбуждать старое сообщение, но

Ты говоришь:

Я хочу сохранить изменения каждого объекта каждые 5 минут или около того.

Так почему бы не использовать планировщик, например, Celery . (Я использую pyramid_celery )

С помощью этого вы можете сохранять каждый объект каждые 5 минут, то есть вы можете добавить декоратор:

 @periodic_task(run_every=crontab(minute="*/5") def somefunction(): #your code here 

Это отлично работает, особенно если вам необходимо обновить свою базу данных, чтобы убедиться, что она актуальна (в случае, когда у вас много пользователей, использующих вашу систему)

Надеюсь, это поможет кому-то сэкономить каждые 5 минут .

  • Использование разных привязок в одном классе в Flask-SQLAlchemy
  • Flask-Sqlalchemy + Sqlalchemy-searchable возвращающий пустой список
  • Подключение к базе данных с помощью SQLAlchemy
  • Как проверить, существует ли схема PostgreSQL с помощью SQLAlchemy?
  • Список смежных флагов-SqlAlchemy Связь неожиданной ошибки backfref
  • Выполните какой-либо код, когда действительно удалено удаление объекта SQLAlchemy
  • Таблица сопоставления SQLAlchemy с столбцами non-ascii для класса
  • Как использовать SQLAlchemy для беспрепятственного доступа к нескольким базам данных?
  •  
    Interesting Posts for Van-Lav

    Как читать / понимать сериализованную строку данных PHP в python

    Проблемы, связанные с перехватом подпроцесса в режиме реального времени

    Как удалить элементы из XML с помощью Python

    Запуск сценариев Python внутри Android Studio

    вложенность defaultdicts на произвольной глубине

    Python: вставить в список быстрее, чем O (N)?

    Ошибка внутреннего сервера при использовании Python OpenId с аутентификацией Google

    Понимание min_df и max_df в scikit CountVectorizer

    Tkinter в Python 3.4 в Windows не публикует данные буфера обмена в буфер обмена Windows при выходе

    Каковы некоторые хорошие способы установки пути в поддерживаемом Multi-OS скрипте Python

    удалить старую версию python (fedora)

    Почему python numpy.delete не вызывает indexError, когда индекс вне границ находится в массиве np

    Вызов параметра функции в другом

    Почему сюжет, созданный из ggplot, не появляется?

    Выбирайте только числовые поля, в том числе содержащие поплавки из pandas dataframe

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