SQLAlchemy-仅查询非瞬态对象

时间:2019-03-03 03:46:38

标签: python postgresql flask sqlalchemy flask-sqlalchemy

我有一个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: https://stackoverflow.com/questions/9381536/sqlalchemy-one-to-one-relationship-on-the-same-table
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]

0 个答案:

没有答案