如何用Python向MySQL数据库插入NULL数据?

70 投票
8 回答
156804 浏览
提问于 2025-04-16 14:51

我在用Python脚本往MySQL里插入数据时遇到了一个奇怪的错误。这个错误主要是因为我插入的一个变量是空的。我觉得MySQL不喜欢空变量,但有没有其他方法可以让它在我的插入语句中正常工作呢?

我可以用一个IF语句把空变量变成0,但这样可能会影响我之后在MySQL中进行的数据分析。有没有办法把它转换成NULL或者其他什么东西,这样MySQL就能接受,但又不会添加任何内容呢?

8 个回答

1

关于在Python中使用SQL语句的参数,有个小提示。可以看看RealPython上关于这个主题的文章 - 用Python防止SQL注入攻击。还有一篇来自TowardsDataScience.com的好文章 - Python中模板化SQL查询的简单方法。这些文章对我解决None/NULL的问题很有帮助。

另外,我发现如果我在INSERT查询的VALUES中直接写“NULL”(不加引号),SQL Server数据库能正确理解这个值。只有在需要通过字符串插值有条件地添加NULL或其他值时,才会出现翻译问题。

示例:

cursor.execute("SELECT admin FROM users WHERE username = %s'", (username, ));

cursor.execute("SELECT admin FROM users WHERE username = %(username)s", {'username': username});

更新:这个StackOverflow讨论更符合我想做的事情,可能对其他人也有帮助。

示例:

import pypyodbc
myData = [
    (1, 'foo'),
    (2, None),
    (3, 'bar'),
]
connStr = """
DSN=myDb_SQLEXPRESS;
"""
cnxn = pypyodbc.connect(connStr)
crsr = cnxn.cursor()
sql = """
INSERT INTO myTable VALUES (?, ?)
"""
for dataRow in myData:
    print(dataRow)
    crsr.execute(sql, dataRow)
cnxn.commit()
crsr.close()
cnxn.close()
210

在使用mysqldb和cursor.execute()的时候,要传入值None,而不是"NULL"

value = None
cursor.execute("INSERT INTO table (`column1`) VALUES (%s)", (value,))

找到答案可以在这里查看

-26

先快速检查一下是否为空,如果是的话,就把它设置为NULL:

if(!variable_to_insert)
    variable_to_insert = "NULL"

...然后确保在插入语句中,插入的变量不要加上引号,比如:

insert = "INSERT INTO table (var) VALUES (%s)" % (variable_to_insert)
...

而不是这样:

insert = "INSERT INTO table (var) VALUES ('%s')" % (variable_to_insert)
...

撰写回答