pymysql错误 (1054, "Unknown column '***' in 'field list'") 解决方案

目录

经过试验之后,发现有三种方法解决上面的问题

扩展

有关字符串的终极使用



 数据库表结构:

在写解决方法前,先写好前提条件代码:

import pymysql
db = pymysql.connect("localhost", "root", "123456", "zq")
cursor = db.cursor()

 下面是有运行报错的代码:

def last():
    # 该方法是获取该表最后的ID值
    cursor.execute('select money from test order by id desc limit 1')
    db.commit()  # 提交事件
    return cursor.fetchone()[0]

def inset(i, k):
    cursor.execute("INSERT INTO test (money,gui) VALUE (%d,%s)" % (i, k))
    db.commit()  # 提交事

def main():
    num = last() + 0.88 * 3
    str = "hello2"
    print(inset1(num, str))
    
if __name__ == '__main__':
    main()

执行后报如下错误:

 根据报错信息看,是说字段列表中的未知列“hello2”,即是数据库表中没有“hello2”这个字段,但我们这和字段有什么关系,我们要的是表插入一条值为 sum值 和 “hello2” 的记录,而不是查找什么“hello2”字段,那为什么报错信息会这样呢?好吧,我也不懂,有懂的希望能告诉我啊,呃呃呃呃呃。

虽然不懂它的内部原理,但是还是能解决这个问题的。下面就来说说了:

经过试验之后,发现有三种方法解决上面的问题

(1)

针对 str 变量,就是用一种引号包括另一种引号只要有嵌套关系即可,最终包括字符串,如下:

def main():
    num = last() + 0.88 * 3
    str = "'hello2'"        # 或者是>>  str = '"hello2"'
    print(inset4(num, str))

if __name__ == '__main__':
    main()

(2)

针对 execute 执行语句,修改接收传入字符串的格式化符 %s 的书写格式,如下:

cursor.execute("INSERT INTO test (money,gui) VALUE (%d,'%s')" % (i, k))

(3)

也是针对 execute 执行语句,这种方法不理解

cursor.execute("""INSERT INTO test (money,gui) VALUE (%d, '%s')""" % (i, k))

或者是这样(也就是引号的不同罢了)

cursor.execute("""INSERT INTO test (money,gui) VALUE (%d, "%s")""" % (i, k))

 

扩展

好了,通过上面三种方法,基本就解决我们大部分的需求了,但作为学技术的,就是要有不满足的心态,接下来就针对这个问题扩展一下视野吧。个人理解,有不足之处还请见谅并指出。

首先,在还没使用上述的三种方法之前,如果 str 的值是数值型(例如123456),那也会成功插入数据,不会报错,我也很疑惑,不知道原理(求知的欲望在等待你的解答 ~_^)。

其次,在这里在讲解有关格式化命令符的方法,说到方法,想必你也猜到了,就是 format() 方法。那么该方法怎么使用呢。

还是向数据库中出入一条数据,借用上面的代码,不过的 execute执行语句有点不同:不使用格式化命令符,而是使用format()方法。使用方法如下:

def inset2(i, k):
    cursor.execute("INSERT INTO test (money,gui) VALUE ({0},{1})".format(i, k))
    db.commit()  # 提交事件

但是如果就这样写的话,还是会报上面的错误的,那怎么解决呢????

其实解决方法你已经知道了,没错,就是上面的三种方法,相似的问题总是有相似的解决方法。

 

最后,再贴出一些有关字符串应用的理解:

# 我们定义一个字符串,是用引号括起来的,不管是单引还是双引,如下

str = "hello"
str = 'hello'

# 这就表示我们定义的一个值为 hello 的字符串,那么,我们把 str 这个字符串传给 execute 语句的时候,是传了 hello 呢,还是传了 'hello' 呢,理解了这个问题,那也就理解了上面为什么报错了。
# 下面我们来猜想实验一下,如果传的是 'hello' 这个值得话(为了好说明,就选了单引号),那 execute 语句执行的语句就是下面的这样变化了:

cursor.execute("INSERT INTO test (money,gui) VALUE (%d, %s)" % (i, k))

# 先设定 i 的值为2019,k 的值为传过来的 'hello' 值。接收传过来的值后,会转换成最终要执行的语句,如下:

cursor.execute("INSERT INTO test (money,gui) VALUE (2019, 'hello')")

# 好了,如果真的是向上面这样的话,那么恭喜你,你已经成功了,数据库中有新加入的数据,说明传入的 str 的值是 'hello' , 但是我们已经知道,这样写代码时会报错的,提示找不到 hello 字段。

# 所有,我猜想哦,传入的 str 值是 hello 这个值,没有什么引号,就单单是 hello 这个值,而看我们的设计表,str 是varchar 类型,很明显不符合吧,这个样,系统才会提示提示找不到 hello 字段这样的报错。

# 好了,上面都是我猜想的哦,也不知道是不是这样。不过,我们就当它是这个样的,这才好去解释。

# 看到这里,想必也对上面说的三种解决方法有了大概的理解了吧。既然传入的值是 hello 这个值,那我们再给它加上一对引号,这样传给 execute 执行语句的值不就是 'hello' 的么,这就符合我们定义的数据类型了;或者在 execute 执行语句的格式符上加上一对引号,也是同样的。

# 华丽丽的变身:

str = "'hello'"

# 传值后的表象:

cursor.execute("INSERT INTO test (money,gui) VALUE (2019, 'hello')")

 

 

有关字符串的终极使用

上面之所以噼里啪啦的说了这么多,这是因为我们对Python不慎了解o( ̄ヘ ̄o#),说了你看你会心酸。

为什么会报错,那是因为使用的pymysql在插入数据的时候,如果是vchar类型的,需要加入单引号,所以上面我们说了那么多,就是为了要加入一个引号,哈哈,苦逼了吧。而在使用字符串这方面,Python给我们提供了一个非常有用的方法,那就就就就就,好吧,不逗了,那就是 repr() 方法,这方法可以自动帮我们给字符串加上引号。

 

所以啊,我们只要使用好 repr() 方法就好了,使用方法如下:

def main():
    num = last() + 0.88 * 3
    str = "hello2"
    inset(num, repr(str))

或者是

def inset(i, k):
    cursor.execute("INSERT INTO test (money,gui) VALUE ({0},{1})".format(i, repr(k)))
    db.commit()  # 提交事件

又或者是

def inset(i, k):
    cursor.execute('INSERT INTO test (money,gui) VALUE (%d, %s)' % (i, repr(k)))
    db.commit()  # 提交事

 

好了,到处结束了。

 

 

你可能感兴趣的:(MySQL)