У меня есть запрос 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]