如果返回的组合框值为空,Python、mySQL INSERT 将失败

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

Python 新手。

我正在创建一个表单(使用 TKinter)来填充 mySQL 表。 该表单具有组合框,可查找数据库中的引用表。当用户选择组合框值时,查找表中所选值的主键将作为外键插入到目标表中(下面代码中的字段 1 和 3)。 该表单还包含短文本(tk Entry)和长文本(tk Text)字段(字段 2 和 4)。 所有字段都是可选的。

如果组合框字段没有返回空值,则 sql 语句可以正常工作,但如果一个或多个组合框字段为空,则 sql 插入将失败。如果文本字段中有空值,它会正常工作。我希望也能够用空值填充数据库中的外键字段。

# -- Parse data to prepare for sql insert -- #
def parse_data():
    field1 = field1_combobox.get() 
    field2 = field2_entry.get() 
    field3 = field3_combobox.get()
    field4 = field4_textbox.get(1.0, 'end')

# -- truncate combobox values to retain only the primary keys --  Pipes for delimiters in debugging --#
    print (field1[0:1], "|", 
           field2, "|",
           field3[0:1], "|",
           field4)

    sql = """INSERT INTO mytable (field1, field2, field3, field4) VALUES (%s, %s, %s, %s)"""
    val = (field1[0:1], field2, field3[0:1], field4)
    
    try:
         cursor.execute(sql, val)
         conn.commit()
         print("record inserted")

    except:
         conn.rollback
         print("update failed")

    conn.close

如果组合框中存在 NULL 值,我希望 SQL 语句能够工作。我已经检查过数据库中的相关字段都是可以为空的。

我没有从 Python 或 SQL 收到任何错误消息 - 记录根本没有插入。

有人知道为什么吗?是因为代码试图截断 NULL 吗?但如果是这种情况,如果我注释掉 SQL,打印语句仍然可以正常工作。看来是mySQL有问题。


顺便说一句,我知道截断从组合框返回的数据可能不是最优雅的解决方案:我想在表单中显示组合框中的值,但我只想将 ID 填充为目标表中的 FK。如果有更好的方法,我也很感激。

python mysql tkinter combobox nullable
1个回答
0
投票

为了在 SQL 中获取

NULL
值,您需要将组合框中的空字符串替换为
None

    val = (field1[0:1] or None, field2 or None, field3[0:1] or None, field4 or None)
© www.soinside.com 2019 - 2024. All rights reserved.