Я использую FlaskSqlachemy с Postgresql базой данных.
У меня есть таблица с именем Order и таблица с именем Attempt (попытка доставить заказ) в отношении один ко многим. Таблица попыток имеет FK для order.id.
Я хочу вставить записи в таблицу Order и Attempt в одном сеансе. Проблема в том, что я не знаю order.id, прежде чем вставить его. Это потому, что order.id - это PK таблицы Order с функцией автоинкремента.
Я могу сначала вставить заказ, затем проверить order.id и, наконец, вставить попытку. Моя проблема: если вторая вставка не удалась, я получаю заказ, с которым не было предпринято никаких попыток.
Каков наилучший метод в этих случаях?
Ниже приведена упрощенная версия моих моделей БД:
class Order(db.Model):
id = db.Column(db.Integer, primary_key=True)
attempts = db.relationship('Attempt', backref='order', lazy='select',
order_by="Attempt.date")
class Attempt(db.Model):
id = db.Column(db.Integer, primary_key=True)
order_id = db.Column(None, db.ForeignKey('order.id'))
А ниже приведено мое решение:
# Create an order object
new_order = Order()
# Try to add it to db
try:
db.session.add(new_order)
db.session.commit()
except Exception:
....
return redirect(url_for('scheduleorder'))
else:
order = Order.query.filter_by(token=token).first()
# Create an attempt object
new_attempt = Attempt(order_id=order.id)
try:
db.session.add(new_attempt)
db.session.commit()
except Exception:
...
return redirect(url_for('scheduleorder'))
else:
...
return redirect(url_for('scheduleorder'))