SQLAlchemy - запрашивает только непереходные объекты - PullRequest
0 голосов
/ 03 марта 2019

У меня есть запрос one_or_none() SQLAlchemy, который приводит к ошибке, потому что существует второй, временный объект, созданный ранее в коде.Я хочу, чтобы этот объект существовал, но его не нужно добавлять в базу данных.Можно ли построить запрос, который игнорирует временные объекты и ищет только постоянные?

Это использует Postgres и Python / Flask.

Редактировать:

Это модель:

class Partial(db.Model):                                                        
  __tablename__ = u'partials'                                                
  id = db.Column(db.Integer, primary_key=True)                                  
  article_id = db.Column(db.Integer, db.ForeignKey(Article.id, name=u'partials_article_id_fkey', use_alter=True), server_default=expression.null())
  article = db.relationship(Article, backref=u'partials', foreign_keys=[article_id], post_update=True)
  book_id = db.Column(db.Integer, db.ForeignKey(Book.id), server_default=expression.null())
  book = db.relationship(Book, backref=u'partials')                             
  chapter_id = db.Column(db.Integer, db.ForeignKey(Chapter.id), server_default=expression.null())
  chapter = db.relationship(Chapter, backref=u'partials')                       
  text = db.Column(db.UnicodeText, server_default=expression.null())            
  citation = db.Column(db.Unicode(256), server_default=expression.null())       
  next_partial_id = db.Column(db.Integer, db.ForeignKey(u'partials.id'), server_default=expression.null())                                                    
  created = db.Column(db.DateTime,                                              
    server_default=db.func.timezone(u'UTC', db.func.current_timestamp()))       
  updated = db.Column(db.DateTime,                                              
    server_default=db.func.timezone(u'UTC', db.func.current_timestamp()),       
    server_onupdate=db.func.timezone(u'UTC', db.func.current_timestamp()))      
#monkey-patch self-referential relationship: /7567960/sqlalchemy-otnoshenie-odin-k-odnomu-na-odnoi-i-toi-zhe-tablitse
Partial.next_partial = db.relationship(Partial, uselist=False, backref=db.backref(u'prev_partial', uselist=False), remote_side=Partial.id)

Вот так я создаю временный объект:

Он явно не добавляется в сеанс.Я думаю, что он автоматически добавляется из-за отношений с другими моделями и / или каскадными настройками.

partial = Partial(article_id=article.id, book_id=book.id, chapter_id=chapter.id, text=partial_string['text'])

И как я запрашиваю:

На данный момент существует (может) существовавший ранее зафиксированныйPartial, который я хотел бы вернуть, игнорируя тот, который был создан и не зафиксирован в коде выше.Однако найдено несколько строк.

match  = Partial.query.filter_by(article_id=article_id, book_id=partial.book_id, text=partial.text).one_or_none()

Дополнительно:

Другая проблема заключается в том, что временный объект вводится в базу данных в db.session.commit().У меня есть ужасный обходной путь для этого.

match = Partial.query.filter_by(article_id=article_id, book_id=partial.book_id, text=partial.text).all()
if match:                                                                       
  try:                                                                          
    db.session.expunge(partial)                                                 
  except InvalidRequestError:                                                                       
    pass                                                                        
  return match[0]
...