【问题标题】:Unable to assing IDs automatically in SQLite无法在 SQLite 中自动分配 ID
【发布时间】:2021-11-26 23:48:47
【问题描述】:

我有以下数据库模型:

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 时,它会因 NOT Null 约束失败而失败

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL 约束失败:questions.survey_id [SQL: INSERT INTO questions (survey_id, date_posted, lan_code, q1, q2, q3) VALUES (?, ?, ?, ?, ?, ?)] [参数:(无,'2021-10-06 19:36:08.192194','en','你好吗?','你接种疫苗了吗?','你的生日是什么时候?')]

如果我为调查手动分配 ID,它会完美运行。但是,有没有办法让数据库处理这个问题?

【问题讨论】:

    标签: sqlite sqlalchemy flask-sqlalchemy


    【解决方案1】:

    如果你要创建一个新的Survey,你可以这样做:

    qs = Questions(q1='Why?', q2='What?', q3='When?')
    survey = Survey(question_ts=[qs])
    db.session.add(survey)
    db.session.commit()
    

    SQLAlchemy 将识别对象是相关的并设置键和关系。

    如果您要将Questions 添加到现有的Survey,则附加到关系:

    survey = session.query(Survey).first()
    qs = Questions(q1='Why?', q2='What?', q3='When?')
    survey.question_ts.append(qs)
    db.session.commit()
    

    如果您需要在提交前获取 id,请将对象添加到会话中,然后调用会话的 flush 方法。

    【讨论】:

    • 这正是我所需要的,非常感谢!
    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2021-07-19
    • 2022-08-03
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多