如何用Python向MySQL数据库插入NULL数据?
我在用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)
...