记错pymysql.err.Error: Already closed


我的目的是将从中国观鸟记录中心网站上将爬取的数据保存到mysql数据库中,我是用的软件是pycharm

PyMySQL 安装

我使用的pycharm下方有自带的Python Packages,直接搜索PyMySQL点击install进行安装等待完成即可。
在这里插入图片描述
当然也可以使用cmd命令中的pip命令来执行,添加pip镜像源之后应该不会有什么太大的问题,安装失败可以尝试多换几个镜像源。
如果上面两种方法你没有或者失败了的话,我建议你可以查看这篇文章,应该对你有很大的帮助。

PyMySQL的使用

1.提前创建好准备保存的数据库和表
在这里插入图片描述
2.在程序的开头我们要进行导包操作

import pymysql.cursors

3.连接数据库

connection = pymysql.connect(host='localhost',
				     user='root',
				     password='********',
				     db='bird',
				     charset='utf8')

4.获取会话指针

connection.cursor()

5.编写sql语句

sql = "insert into `bird_record`(`记录用户`,`观测时间`,`观测地点`,`坐标定位`,`中文名`,`英文名`,`拉丁名`,`目`,`科`,`数量`,`基础统计`) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"

6.执行sql语句

cursor.execute(sql, (参数1,参数2···)

7.提交

connection.commit()

8.关闭连接

connection.close()

实际中的出错

connection = pymysql.connect(host='localhost',user='root',password='******',db='bird',charset='utf8')
	for i in range(len(s2)):
		try:
		# 获取会话指针
			with connection.cursor() as cursor:
				# 创建SQL语句
				sql = "insert into `bird_record`(`记录用户`,`观测时间`,`观测地点`,`坐标定位`,`中文名`,`英文名`,`拉丁名`,`目`,`科`,`数量`,`基础统计`) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
				# 执行SQL语句
				cursor.execute(sql, (u,tb+"至"+te,a,l,taxon_name[i],latinname[i],englishname[i],taxonordername[i],taxonfamilyname[i],taxon_count[i],sum))
				# 提交
				connection.commit()
		finally:
			connection.close()

代码运行出来之后却出现了报错如下
pymysql.err.OperationalError: (1241, ‘Operand should contain 1 column(s)’)
查询资料之后发现错误的原因是数据库要求写入的格式是字符串类型的。不是列表类型
把执行sql语句代码改为:

cursor.execute(sql,(str(u),str(tb+"至"+te),str(a),str(l),str(taxon_name[i]), str(latinname[i]),str(englishname[i]),str(taxonordername[i]),str(taxonfamilyname[i]), str(taxon_count[i]),str(sum)))

再运行代码,程序再次报错如下:
pymysql.err.Error: Already closed
查询资料也没有得到可以解决的方案,但是我理解到了错误的大致意思是在使用数据库之前,数据库的连接已经关闭了。于是我反思是不是代码的顺序出现问题,发现for循环之内已经将数据库连接关闭,只要将关闭的语句拿到外面即可,于是乎将代码改成如下:

try:
	# 获取会话指针
	with connection.cursor() as cursor:
		# 创建SQL语句
		for i in range(len(s2)):
			sql = "insert into `bird_record`(`记录用户`,`观测时间`,`观测地点`,`坐标定位`,`中文名`,`英文名`,`拉丁名`,`目`,`科`,`数量`,`基础统计`) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
			# 执行SQL语句
			cursor.execute(sql, (
			str(u), str(tb + "至" + te), str(a), str(l), str(taxon_name[i]), str(latinname[i]), str(englishname[i]),
			str(taxonordername[i]), str(taxonfamilyname[i]), str(taxon_count[i]), str(sum)))
			# 提交
			connection.commit()
finally:
	connection.close()

在运行代码就不会出现错误,想要的数据也会完整的保存到mysql数据库中,结果如下:
在这里插入图片描述


版权声明:本文为qq_45279235原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。