如何使用 python 和 mysql.connector 将 NULL 值插入整数列

How do i insert a NULL value into an integer column using python and mysql.connector

该列没有诸如 NOT NULL 之类的约束,并且由于我使用的是 python,所以我尝试插入 None 而不是 NULL。它仍然不起作用。有人可以帮忙吗?

如何创建 table:

create_species = "CREATE TABLE `species` (" \
             "  `{}` varchar(40) DEFAULT '' NOT NULL," \
             "  `{}` varchar(40) DEFAULT '' NOT NULL," \
             "  `{}` varchar(40) DEFAULT '' NOT NULL," \
             "  `{}` varchar(40) DEFAULT '' NOT NULL," \
             "  `{}` varchar(70) DEFAULT '' NOT NULL," \
             "  `{}` varchar(40) DEFAULT '' NOT NULL," \
             "  `{}` varchar(40) DEFAULT '' NOT NULL," \
             "  `{}` int(20)," \
             "  `{}` varchar(40) DEFAULT '' NOT NULL," \
             "  `{}` varchar(40) DEFAULT '' NOT NULL," \

我如何在 table 中插入:

"INSERT INTO species (name, classification, designation, average_height, skin_colors, hair_colors, eye_colors, average_lifespan, language, homeworld)"
              "VALUES ('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}');".format(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9])

其中 row[7] 在某些情况下是一个整数(这是它起作用的时候),在其他情况下它的值为“NA”,所以我将其转换为 None 如下:

if row[7] == "NA":
  row[7] = None

该值必须为 NULL,否则 avg() 和其他类似操作会给我一个错误的结果。

请不要构建这样的查询:

"INSERT INTO foo VALUES ({}, {}, {})".format(1, "bar", None)

假设值 1"bar"None 来自不受信任的来源,这会使您面临一种名为 SQL injection 的非常严重的软件漏洞.大多数数据源应该被认为是不受信任的,安全地编写查询应该始终是默认设置。

上述查询还有一个问题:错误。这会生成

INSERT INTO foo VALUES (1, bar, None)

bar 周围缺少引号(字符串应引用为 'bar'),它在应使用 NULL.

的地方使用 None

correct way to do this是将参数1"bar"None分别传给你的数据库:

parameters = (1, "bar", None)
cursor.execute("INSERT INTO foo VALUES (%s, %s, %s)", parameters)

# or you can name parameters

parameter_dict = {
    "first": 1,
    "second": "bar",
    "third": None,
}
cursor.execute(
    "INSERT INTO foo VALUES (%(first)s, %(second)s, %(third)s)", 
    parameter_dict,
)

这可以防止 SQL 注入,还可以处理引用字符串,将 None 转换为 NULL

最后,您可以跳过应该为 null 的值(或使用列的默认值)并让 MySQL 为您填充它们,例如

INSERT INTO foo (first, second) VALUES (1, 'bar');