我有一个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]