【问题标题】:pymysql | insert NULL into nulable int fieldpymysql |将 NULL 插入 nulable int 字段
【发布时间】:2018-10-14 04:56:45
【问题描述】:

我创建了一个具有 int 类型的默认 NULL 字段的表。我需要使用参数查询插入数据,但我无法通过变量将 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
  • 返回 'NULL'
  • 返回无
  • 返回''

但上述允许在字段中插入 NULL。

  • 当我从 mk_int 返回 'NULL' 时,它会给出类型不匹配的警告并插入 0 而不是 NULL。

【问题讨论】:

标签: mysql null pymysql


【解决方案1】:

我建议使用 Python None 作为绑定值。

我认为这可以通过在当前代码中返回 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 并且没有做任何事情。

让我们尝试执行一个 list 值。然后执行会看到它给了它一些东西。我们给了它一个列表,而不仅仅是None。列表中的第一项是None

让我们尝试添加括号:

  conn.cursor().execute(insertSQL, ( None ) )
                                   ^      ^

如果我们让它工作,那么我们可以测试用函数调用替换None(用括号括起来)。

【讨论】:

  • 我已经尝试使用 'None' 并得到以下错误。 (1064,“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '%s)' 附近使用正确的语法”):ProgrammingError
  • 也许添加括号? .execute(insertSql, ( None ) ) 错误消息表明发送到 MySQL 的 sql 文本包含文字 %s,因此这一定意味着 execute 没有进行绑定(将占位符替换为值.)。那么,我们如何让execute 认识到需要进行绑定呢? execute 可能需要一个值列表。所以让我们给它一个清单。包含一个值的列表。如果这不起作用,我们将尝试其他方法...
猜你喜欢
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2015-01-01
相关资源
最近更新 更多