Не удается автоматически проверять идентификаторы в SQLite

#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. Это именно то, что мне было нужно, большое вам спасибо!