【问题标题】:How can I insert NULL data into MySQL database with Python?如何使用 Python 将 NULL 数据插入 MySQL 数据库?
【发布时间】:2023-03-08 04:26:02
【问题描述】:

在将一些数据从 Python 脚本插入 MySQL 时,我遇到了一个奇怪的错误。它基本上与我要插入的空白变量有关。我认为 MySQL 不喜欢空白变量,但我是否可以将其更改为其他内容,以便它与我的插入语句一起使用?

我可以成功地使用 IF 语句将其变为 0(如果它为空白),但这可能会打乱我计划稍后在 MySQL 中进行的一些数据分析。有没有办法将它转换为NULL 或其他东西以便 MySQL 接受它但不添加任何东西?

【问题讨论】:

  • 您尝试将此 NULL 值插入的列是否允许 NULL?如果不是,具体是什么错误?
  • 是的,它确实允许为空。我看看我是否没有插入任何东西,它说该列是空的,问题是我的 sql 语句已经构建了。基本上我是从一个文件中提取一堆价格,有时价格是空白的,这意味着没有价格可用。我仍然希望插入详细信息,但不希望插入价格。
  • 我的第一个想法是将它们全部归零,但稍后当我进行一些分析并发现免费产品会改变产品的平均价格等时,它会搞砸我。跨度>
  • 您遇到的“奇怪错误”到底是什么? “空白”是什么意思?做print repr(socalled_blank_value) 并告诉我们答案。对应列的SQL类型是什么?
  • 对不起那个约翰。当我打印变量的值它完全空白时,错误是“数据在第 1 行 [SQLCode: 1265], [SQLState: 01000] 的列 'price' 被截断。我不认为有空格,因为如果我输入“if variable ==”“:”,它实际上与这个变量的值匹配。

标签: python mysql


【解决方案1】:

使用mysqldb和cursor.execute()时,传递值None,而不是"NULL"

value = None
cursor.execute("INSERT INTO table (`column1`) VALUES (%s)", (value,))

找到答案here

【讨论】:

  • 在我的情况下是一个空字符串
  • 如果我们不使用 %s 符号怎么办?我通常使用 "blah blah" + var + "blah blah" 表示法。
  • 对我来说这个插入 None 作为字符串而不是 NULL 在数据库中
  • 哇,出于某种原因,(value,) 等变量值旁边的逗号很重要。尝试插入同一行代码时出现错误,但没有逗号。
  • @velociraptor11 这是因为它需要一个元组。在python中,如果一个元组只有一个元素,你仍然必须使用逗号(元素,),否则括号将照常计算。一旦括号被评估,(元素)就成为元素
【解决方案2】:

如果 col1 是 char,col2 是 int,一个技巧可能是:

insert into table (col1, col2) values (%s, %s) % ("'{}'".format(val1) if val1 else "NULL", val2 if val2 else "NULL");

%s 不需要加 ' ',可以在传值到 sql 之前处理。

此方法在使用 sqlalchemy 会话执行 sql 时有效,例如 session.execute(text(sql))

ps: sql 还没有测试

【讨论】:

    【解决方案3】:

    为什么不将变量设置为等于'no price' 之类的字符串,然后在以后想对数字进行数学运算时将其过滤掉?

    filter(lambda x: x != 'no price',list_of_data_from_database)
    

    【讨论】:

      【解决方案4】:

      快速检查空白,如果是,将其设置为 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)
      ...
      

      【讨论】:

      • 感谢您的消息,我想到了,但那不只是插入一个带有文本“NULL”的变量吗?还是文本 NULL 在插入数据库时​​是一个特殊字符?
      • @Lostsoul:所以也许你应该向我们展示你脚本的相关部分。
      • NULL 是插入 sql 时的特殊字符(不带引号)。如果您使用第二个插入,它将插入字符串“NULL”,但第一个将有如下语句:INSERT INTO table (var) VALUES (NULL),它将为该值放入一个特殊的 NULL。
      • @phaxian 你不应该这样插入。你应该传递一个带参数的字符串,然后是一个参数值列表作为一个元组。
      • 这真的很糟糕。您应该在 sql 语句中使用参数。不使用参数会使您容易受到 sql 注入攻击。
      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 2019-02-22
      • 2011-05-13
      • 2019-09-25
      • 2020-03-07
      • 1970-01-01
      • 2014-09-24
      • 2017-01-11
      相关资源
      最近更新 更多