#sqlite #sqlalchemy #flask-sqlalchemy
Вопрос:
У меня есть следующая модель базы данных:
class Survey(db.Model):
id = db.Column(db.Integer, primary_key=True)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
question_ts = db.relationship('Questions')
class Questions(db.Model):
id = db.Column(db.Integer, primary_key=True)
survey_id = db.Column(db.Integer, db.ForeignKey('survey.id'), nullable=False)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
lan_code = db.Column(db.String(3), nullable=False)
q1 = db.Column(db.String(100), nullable=False)
q2 = db.Column(db.String(100), nullable=False)
q3 = db.Column(db.String(100), nullable=False)
Когда я вставляю q1, q2, q3, он терпит неудачу с ненулевым ограничением.
ошибка целостности sqlalchemy.exc.: (sqlite3.Ошибка целостности) НЕ ВЫПОЛНЕНО ограничение NOT NULL: вопросы.идентификатор опроса [SQL: ВСТАВИТЬ В вопросы (идентификатор опроса, дата публикации, код локальной сети, q1, q2, q3) ЗНАЧЕНИЯ (?, ?, ?, ?, ?, ?)] [параметры: (Отсутствуют, ‘2021-10-06 19:36:08.192194’, ‘ru», «как дела?», » Тебе сделали прививку?», » Когда у тебя день рождения?»)]
Это отлично работает, если я вручную назначаю идентификаторы для опроса. Однако есть ли способ заставить базу данных обрабатывать это?
Ответ №1:
Если вы создаете новый Survey
, вы бы сделали это так:
qs = Questions(q1='Why?', q2='What?', q3='When?')
survey = Survey(question_ts=[qs])
db.session.add(survey)
db.session.commit()
SQLAlchemy распознает, что объекты связаны, и настроит ключи и отношения.
Если вы добавляете a Questions
к существующему Survey
, вы добавляете его в отношения:
survey = session.query(Survey).first()
qs = Questions(q1='Why?', q2='What?', q3='When?')
survey.question_ts.append(qs)
db.session.commit()
Если вам нужно получить идентификаторы перед фиксацией, добавьте объект(ы) в сеанс, а затем вызовите метод сеанса flush
.
Комментарии:
1. Это именно то, что мне было нужно, большое вам спасибо!