You need to enable JavaScript to run this app. Python Flask Web应用基于Windows认证连接SQL Server插入数据报TypeError
优惠活动
大模型
产品
解决方案
定价
更多

Python Flask Web应用基于Windows认证连接SQL Server插入数据报TypeError

错误定位与修复方案

核心报错触发原因

  • Flask应用实例未初始化:代码导入了Flask类,但从未执行app = Flask(__name__)创建应用实例,直接使用@app.route装饰器时,解释器无法定位有效的app对象,最终触发TypeError: 'type' object is not subscriptable。
  • 表单字段赋值误加行尾逗号:Loan_Amount、Monthly_Payment、Loan_Tram三个变量赋值时,行尾多写了英文逗号,Python会自动将这三个变量解析为单元素元组,而非表单提交的字符串值,传参时会引发后续数据类型不匹配问题。
  • Flask依赖未完整导入:代码中使用了render_template、url_for两个Flask内置方法,但从未从flask模块导入,后续调用时会触发未定义错误。

其他会导致运行失败的配置缺陷

  • Windows身份验证连接字符串配置错误:当前拼接的连接字符串包含空值的uid、pwd参数,不符合Windows认证的ODBC连接规范,需指定Trusted_Connection=yes替代账号密码参数。
  • 数据库配置存在转义问题:config.py中的Server名称包含反斜杠,普通Python字符串会将\K识别为无效转义序列,导致连接目标异常。
  • 驱动兼容问题:默认使用的SQL Server是系统内置的旧版ODBC驱动,存在兼容风险,优先推荐使用新版ODBC Driver 17 for SQL Server。

分步修复代码

1. 修正数据库配置文件config.py

# SQL Server Database Connection Properties(Windows身份验证模式)
DATABASE_CONFIG = {
    'Driver': 'ODBC Driver 17 for SQL Server',  # 无新版驱动时可改回'SQL Server'
    'Server': r'NIRJOR\KHUNDOKERNIRJOR',  # 加r前缀避免反斜杠转义
    'Database': 'HalifaxDatabase',
    'Trusted_Connection': 'yes'  # 启用Windows身份验证,无需账号密码
}

2. 修正数据库连接模块db_connection.py

import pypyodbc
import config

# 返回数据库连接对象
def getConnection():
    conn_str = (
        f"Driver={{{config.DATABASE_CONFIG['Driver']}}};"
        f"Server={config.DATABASE_CONFIG['Server']};"
        f"Database={config.DATABASE_CONFIG['Database']};"
        f"Trusted_Connection={config.DATABASE_CONFIG['Trusted_Connection']};"
    )
    connection = pypyodbc.connect(conn_str)
    return connection

3. 修正主程序main.py

from flask import Flask, redirect, request, render_template, url_for
import db_connection as dbConn

# 必须先初始化Flask应用实例
app = Flask(__name__)

# 补全跳转目标视图,确保路由名匹配
@app.route('/')
def CompleteApplication():
    return render_template("CompleteApplication.html")

@app.route('/add_loan', methods=['POST'])
def add_loan():
    if request.method == "POST":
        # 移除所有行尾多余逗号,确保获取的是纯字符串值
        Account_Number = request.form['Account_Number']
        Loan_Amount = request.form['Loan_Amount']
        Monthly_Payment = request.form['Monthly_Payment']
        Interest_Rate = request.form['Interest_Rate']
        Loan_Tram = request.form['Loan_Tram']
        
        connection = dbConn.getConnection()
        try:
            insert_query = '''INSERT INTO Loan_Details (Account_Number, Loan_Amount, Monthly_Payment, Interest_Rate, Loan_Tram) VALUES (?,?,?,?,?);'''
            cursor = connection.cursor()
            cursor.execute(insert_query, [Account_Number, Loan_Amount, Monthly_Payment, Interest_Rate, Loan_Tram])    
            connection.commit()
        finally:
            # 确保数据库连接用完正常释放
            connection.close()
        
        return redirect(url_for('CompleteApplication'))
    
    return render_template("CompleteApplication.html")
    
if __name__ == '__main__':
    app.run(debug=True)

额外注意事项

  • 字段拼写校验:当前代码中Loan_Tram疑似为Loan_Term的拼写错误,需同步前端表单的字段名和后端取数的字段名,避免提交时无法获取值。
  • 若使用旧版ODBC驱动SQL Server,需保证连接字符串中无多余的空值账号密码参数,否则会触发认证失败错误。
  • 数据库操作时建议增加异常捕获逻辑,避免未处理的数据库异常导致服务崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 21:15:03