如何使用 pyodbc 和 Flask 将空值(不是空字符串)传递到 SQL Server?

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

环境:

  • Flask / Pyodbc / SQL Server

当尝试将 Flask 中的表单内容传递到 SQL Server 存储过程时,我需要选择传递空值。

@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)

当 test 到达 SQL Server 时,它的值是一个空字符串,而不是我需要的 NULL 值。

此时我可以在 SQL Server 上纠正此错误,但是由于 SQL 更昂贵(并且我不太愿意修改 154 个存储过程。)并且这些过程将被调用大量次,我更愿意保留工作在网络服务器上。

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

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

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

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

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

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

python sql-server flask pyodbc
2个回答
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)



0
投票

在@siggemannen'c评论的后面,你确定

request.form.get('test',None)
的结果是
None
吗?如果您发布的表单包含名为
test
的字段,那么您的
request.form
字典将具有属性
test
,并以空白字符串作为值。如果您的表单没有字段
request.form.get('test',None)
,您只会得到
None
等于
test
。您需要检查
test
是否为空白字符串并将其转换为
None
,例如:

test = request.form.get('test',None)
if test == '':
    test = None
© www.soinside.com 2019 - 2024. All rights reserved.