如何使用 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');
该列没有诸如 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');