我创建了一个表,其中包含一个默认的 NULL 字段,类型为 int。我需要使用参数查询插入数据,但我无法通过变量将 NULL 传递到 int 字段中。
import sys
import os
import datetime
import logging
import rds_config
import pymysql
conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5, sql_mode="")
def mk_int (value):
if value in (None, "",''):
return 'NULL'
else:
return int(value)
blankStrOfInt = ''
insertSQL = "INSERT INTO `patientinsight`.`Employee`(`id`,`LastName`,`FirstName`, `DepartmentCode`) VALUES (6, 'Doe', 'John', %s)"
conn.cursor().execute(insertSQL,mk_int(blankStrOfInt))
conn.commit()
我已经尝试了以下内容作为从mk_int返回
- 返回空
- 返回"空"
- 返回 无
- 返回 ''
但是上述允许将 NULL 插入到字段中。
- 当我从mk_int返回"NULL"时,它会给出类型不匹配的警告并插入 0 而不是 NULL。
我建议使用PythonNone
作为绑定值。
我认为这可以通过返回None
来代替当前代码中的'NULL'
来实现,如下所示:
if value in (None, "",''):
return None
我无法解释为什么这行不通。但我不是Python专家。
作为调试的测试,我会尝试使用None
代替对函数的调用,如下所示:
conn.cursor().execute(insertSQL,None)
编辑
测试返回 SQL 错误 1604... syntax to use near '%s'
这表示发送到MySQL的SQL文本包含%s
占位符。
所以这意味着execute
没有绑定值。
可能是因为它没有看到要绑定的值列表,它看到了None
并且没有做任何事情。
让我们尝试给执行一个值列表。然后执行将看到它给了它一些东西。我们给了它一个清单,而不仅仅是None
.列表中的第一项是None
.
让我们尝试添加参数:
conn.cursor().execute(insertSQL, ( None ) )
^ ^
如果我们让它工作,那么我们可以测试用对函数的调用(包装在 parens( 中替换None
。