如果尝试使用 Python 插入空值,我如何让 MySQL 数据库插入默认值?

How can I get a MySQL database to insert a default value if there's an attempt to insert a null value with Python?

我读过的答案与我正在寻找的类似但不完全相同,即:尝试在列中插入具有 NULL 值的行将导致该列的 DEFAULT 正在插入值。

我正在尝试处理 mySQL Python 连接器中的大量插入,其中包含大量我不想单独处理的列值,并且 none 的典型替代方案在这里工作。这是我的代码草图:

qry = "INSERT INTO table (col1, col2, ...) VALUES (%s, %s, ...)"
row_data_dict = defaultdict(lambda : None, {...})
params = []
for col in [col1, col2, ...]:
    params.append(row_data_dict[col])
cursor.execute(qry, tuple(params))

我的主要问题是,将 None 设置为字典中的默认值会导致插入 NULL,或者如果我将行指定为 NOT NULL,则会出现错误。我有大量的列将来可能会发生变化,所以我想尽可能避免为不同的条目设置不同的 'default' 值。

我无法通过跳过插入的列来执行插入 DEFAULT 的典型方法,因为虽然这些列可能具有 DEFAULT 值,但我无法保证并考虑到我我正在做大量插入我不想每次插入时都更改查询字符串,具体取决于它是否是默认值。

另一种插入 DEFAULT 的方法似乎是将 DEFAULT 作为参数之一(例如 INSERT INTO table (col1,...) VALUES (DEFAULT,...)),但在我的例子中,将字典中的默认值设置为 'DEFAULT' 导致错误(mySQL 抱怨它在尝试插入整数列时是一个不正确的整数值,使得它看起来像是将默认值解释为字符串而不是关键字)。

这似乎是一个相对常见的用例,所以让我感到震惊的是我想不出一种方法来做到这一点。我将不胜感激任何我尚未在此处列出的方法来执行此操作或绕过它。

编辑:所有相关列都已经标有 DEFAULT 值,它似乎并没有真正取代 NULL(或 python 的 None) 插入时。

编辑 2:我非常想避免 NULL 的原因是因为 NULL != NULL 并且我想要唯一的行,所以如果有一行 (1, 2, 3, 'Unknown'), INSERT IGNORE'ing 一行 (1, 2, 3, 'Unknown') 不会插入它。使用 NULL 你最终会得到同一条记录的一堆副本,因为其中一个值是未知的。

欢迎使用 Whosebug。您需要做的是在您的数据库中为您想要具有默认值的列添加一个默认值。当您创建 table 时,只需使用 DEFAULT,然后在 table 中创建列后使用值,如下所示:

CREATE TABLE `yourTable` (`id` INT DEFAULT 0, .....)

如果您已经创建了 table 并且您需要更改现有的列,您可以这样做:

ALTER TABLE `yourTable` MODIFY `id` INT DEFAULT 0

所以在来自 python 的插入语句中,只要您传入 NULLNothing 作为该列的值,那么当该行插入到您的数据库,将为该列填充默认值

另一件要记住的事情是,当您为列设置了默认值时,您必须传递正确数量的值。假设您有一个包含 3 列的 table,我们称它们为 colAcolBcolC。 如果你想为 colA 插入一行 colA_valuecolB 没有,所以它将使用它的默认值和 colC_value 对于 colC 那么你需要仍然传递 3 个将用于插入的值。如果你只是传入 colA_valuecolC_value,那么 colA 将得到 colA_valuecolB 将得到 colC_valuecolC 将是 null。您需要传入将由 MySQL 解释的值,如下所示:

INSERT INTO `yourTable` (`colA`, `colB`, `colC`) 
VALUES
('colA_value', null, 'colC_value')

即使您没有为 colB 传递任何内容,您也需要通过传递 null 或 [=36] 从 python 程序中传递一个 null 值=] 到 MySQL 以获得 colB 的值,以便使用默认值

填充 colB

如果您只将 2 个值传递给 MySQL 以在您的 table 中插入一行,则引擎盖下的插入语句将如下所示:

INSERT INTO `yourTable` (`colA`, `colB`, `colC`) 
VALUES
('colA_value', 'colC_value')

这将导致 colA 设置为 colA_valuecolB 设置为 colC_valuecolC 保留为 null

如果您传入要插入到 MySQL 中的正确数量的值(这意味着您需要包含 nullNone 作为要插入的值具有默认值的列)比那是另一回事。如果您传递的值数量正确,请告诉我,以便我可以在需要时帮助您进一步排除故障。

您可以使用 VALUES 列表中的 DEFAULT() 函数指定应使用列的默认值。您可以将它放在 IFNULL() 调用中,以便在提供的值为 NULL.

时使用它
qry = """INSERT INTO table (col1, col2, ...) 
         VALUES (IFNULL(%s, DEFAULT(col1)), IFNULL(%s, DEFAULT(col2)), ...)"""