环境:
当尝试将 Flask 中的表单内容传递到 MS-SQL 存储过程时,我需要选择传递空值。
@app.route('/', methods=['GET', 'POST'])
def index():
user_data = None
if request.method == 'POST':
test = request.form.get('test',None)
#test = request.form['test'] Original also failed
# Query the stored procedure
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute("EXEC [dev].[Test_Get] @test=?", test)
user_data = cursor.fetchall()
cursor.close()
conn.close()
return render_template('index_test.html', user_data=user_data)
当到达 MS-SQL 时,test 的值是一个空字符串,而不是我需要的 NULL 值。
此时我可以在 SQL 服务器上纠正此错误,但是由于 SQL 更昂贵(而且我不太愿意修改 154 个存储过程。)并且这些过程将被调用大量次,我更愿意保留工作在网络服务器上。
注意:这是一个用于显示问题的小型演示脚本和 Flask 页面,并不是完整的应用程序。
当使用flask传递空值时,它发送的是字符串而不是NULL 正在使用的代码:(上面的完整代码)
request.form.get('test',None)
生成的空字符串显示在上面附加的烧瓶图像中。 当空字符串而不是 NULL 值传递给存储过程时,会导致错误。
如果按预期将空值传递给过程,它将返回空值。 (上图)
由于您的 SQL 过程的默认参数值为 NULL,因此您可以使用它来调用具有 NULL 值的过程。
我检查了您的演示图像,我假设您的所有过程都将 NULL 值作为参数的默认值
在Python代码中,我添加了if条件来检查从表单传递的值是否为NULL,然后调用不带任何参数的过程(这将调用默认值为NULL的过程),否则调用提供值的过程。
@app.route('/', methods=['GET', 'POST'])
def index():
user_data = None
if request.method == 'POST':
test = request.form.get('test',None)
# Query the stored procedure
conn = get_db_connection()
cursor = conn.cursor()
if test == None:
cursor.execute("EXEC [dev].[Test_Get]")
else:
cursor.execute("EXEC [dev].[Test_Get] @test=?", test)
user_data = cursor.fetchall()
cursor.close()
conn.close()
return render_template('index_test.html', user_data=user_data)