使用 Flask,如何将 null 值(不是空字符串)传递给 MS-SQL(通过 pyodbc)?

问题描述 投票:0回答:1

环境:

  • Flask / pyodbc / MS-SQL
  • 有 SQL 开发经验,学习 python 和 Flask

当尝试将 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 个存储过程。)并且这些过程将被调用大量次,我更愿意保留工作在网络服务器上。

Proc 在 SSMS 中运行 从烧瓶调用过程

注意:这是一个用于显示问题的小型演示脚本和 Flask 页面,并不是完整的应用程序。

当使用flask传递空值时,它发送的是字符串而不是NULL 正在使用的代码:(上面的完整代码)

    request.form.get('test',None)

生成的空字符串显示在上面附加的烧瓶图像中。 当空字符串而不是 NULL 值传递给存储过程时,会导致错误。

如果按预期将空值传递给过程,它将返回空值。 (上图)

python flask pyodbc
1个回答
0
投票

由于您的 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)


© www.soinside.com 2019 - 2024. All rights reserved.