目录
经过试验之后,发现有三种方法解决上面的问题
扩展
有关字符串的终极使用
数据库表结构:
在写解决方法前,先写好前提条件代码:
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() # 提交事
好了,到处结束了。