【问题标题】:sqlalchemy.exc.IntegrityError - mySql - Error with primary key in auto-increment and storage in databasesqlalchemy.exc.IntegrityError - mySql - 数据库中自动增量和存储中的主键错误
【发布时间】:2018-10-02 20:04:33
【问题描述】:

我正在开发一个 Flask-sqlalchemy 应用程序并使用 mySql 数据库。我有一个表单,我从中接收要存储在名为“intent”的数据库表中的数据。该表有 2 列:intent_id 和 intent_name。

这是我的 SqlAlchemy 模型的代码:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Intent(db.Model):
  __tablename__ = 'intent'
  intent_id = db.Column('intent_id', db.Integer, primary_key=True)
  intent_name = db.Column(db.String(250))

这是我的 Flask Routes 文件的代码:

from flask import Flask, render_template, request, session, redirect, url_for
from models import db, Intent, Sentence

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/test'

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)


@app.route("/", methods = ['POST', 'GET'])
def index():
    if request.method == 'POST':
        intentobj = Intent(intent_name = request.form['intent'])

        db.session.add(intentobj)
        db.session.commit()

        return render_template("index.html", intent_data = Intent.query.all())
    elif request.method == 'GET':
        return render_template("index.html", intent_data = Intent.query.all())

我收到此错误:

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1364, "Field 'intent_id' doesn't have a default value") [SQL: 'INSERT INTO intent (intent_name) VALUES (%s)'] [parameters: ('def',)]

当我创建数据库表类的对象时,我只在其中存储 intent_name(如上所示)。我希望intent_id 自动递增并存储在数据库中,因为它是主键,但我猜它不是那样工作的。

请注意,我使用 phpmyadmin 而不是通过 python 创建了表。

请帮我消除这个错误。谢谢。

【问题讨论】:

    标签: python mysql flask flask-sqlalchemy


    【解决方案1】:

    我不认为 mysql 会自动增加主键。 在列语句中添加autoincrement=True

    intent_id = db.Column('intent_id', db.Integer, primary_key=True, autoincrement=True)
    

    或者,因为你是直接用sql生成代码,所以用

    创建表
    intent_id int NOT NULL PRIMARY_KEY AUTO_INCREMENT
    

    更新 问题出在数据库表上;主键未设置为自动递增。所以,尝试这个命令确实有效:

        ALTER TABLE document MODIFY COLUMN document_id INT auto_increment
    

    【讨论】:

    • 谢谢。我以前试过这个。这是解释为什么它不起作用的链接:docs.sqlalchemy.org/en/latest/dialects/…如果您有任何其他线索,请告诉我
    • 啊,我不知道 sqlalchemy 中的这种行为。但是,我认为这对您而言并不重要,因为该表是在 sqlalchemy 之外创建的。这里有一个相关的 stackoverflow 帖子,它可以帮助您更改现有表(或者如果您在开发数据库上,则将其删除并重新创建)stackoverflow.com/questions/2169080/…
    • 万岁!有效。我运行了您在 phpmyadmin 的链接中提供的 sql 查询。非常感谢! :) 我想知道如何在上面给出的答案中更新它,以便对其他用户也有帮助。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2017-11-11
    • 2015-10-18
    相关资源
    最近更新 更多