You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python、Flask搭建含数据库的网页时遭遇‘parameter primary_key unfilled’等错误的解决咨询

修复Flask-SQLAlchemy数据库连接及实例创建错误

咱们来一步步排查你代码里的问题,你遇到的parameter primary_key unfilled error其实是由几个拼写/参数匹配错误引发的,下面逐个修复:

1. 字段参数大小写错误

在Contacts类的email字段中,你写了Nullable=False,但SQLAlchemy的参数是小写的nullable(Python对大小写敏感),这个错误会导致该字段的非空约束不生效,还可能干扰ORM的字段识别:

# 错误写法
email = db.Column(db.String(20), Nullable=False)
# 修复后
email = db.Column(db.String(20), nullable=False)

2. 创建实例时的参数拼写错误

在/contact路由里,你创建Contacts实例时用了phome_num=phone,但类里定义的字段名是phone_num,拼写错误会让ORM找不到对应字段,进而触发参数缺失的报错:

# 错误写法
entry = Contacts(name=name, phome_num=phone, msg=message, email=email)
# 修复后(同时补充date字段值)
entry = Contacts(name=name, phone_num=phone, msg=message, email=email, date=datetime.now().strftime("%Y-%m-%d"))

另外注意:你的date字段设置了nullable=False,必须传入有效值。这里用datetime模块生成当前日期字符串,记得在文件顶部新增导入:

import datetime

3. 会话提交方法拼写错误

你写了db.session.cummit(),正确的方法名是commit()(少了一个m),这个错误会导致数据无法提交到数据库:

# 错误写法
db.session.cummit()
# 修复后
db.session.commit()

4. 关于主键sno的说明

你的sno字段已经设置了primary_key=True,SQLAlchemy会自动为Integer类型的主键生成自增值,所以创建实例时不需要手动传入sno参数,这部分是没问题的,之前的报错只是其他错误引发的“假象”。


修复后的完整main.py代码

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
import datetime  # 新增导入

app = Flask(__name__, template_folder='template')
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/codingthunder'
db = SQLAlchemy(app)

class Contacts(db.Model):
    sno = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    phone_num = db.Column(db.String(12), nullable=False)
    msg = db.Column(db.String(120), nullable=False)
    date = db.Column(db.String(12), nullable=False)
    email = db.Column(db.String(20), nullable=False)  # 修复大小写问题

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/about')
def about():
    return render_template('about.html')

@app.route('/contact', methods=['GET', 'POST'])
def contacts():
    if request.method == 'POST':
        '''Add entry to the database'''
        name = request.form.get('name')
        email = request.form.get('email')
        phone = request.form.get('phone')
        message = request.form.get('message')
        # 修复参数名并补充date字段值
        entry = Contacts(name=name, phone_num=phone, msg=message, email=email, date=datetime.now().strftime("%Y-%m-%d"))
        db.session.add(entry)
        db.session.commit()  # 修复拼写错误
    return render_template('contact.html')

app.run(debug=True)

额外提醒:确保你的MySQL数据库codingthunder已经创建,并且root用户的密码配置正确(如果你的root有密码,需要把URI改成mysql://root:your_password@localhost/codingthunder)。

内容的提问来源于stack exchange,提问作者Kshitij Lamsoge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:12:52