老师,3.4相关问题请教一下
来源:3-4 python更新mysql数据
JasonHsia
2018-03-25
如果get_one和add_one同时执行就会报错,单独执行的话都是没有问题的。报错信息是_mysql_exceptions.InterfaceError: (0, '') 这个情况可以避免吗
4回答
-
首先,定位问题。从错误里面可以看到报的是connection错误,也就是连接错误。
第二步,分析代码。在__init__方法中调用了get_conn()获得了连接,但是get_one时你调用了 close_conn()将连接关闭了,所以会报错。
第三步,解决问题。将__init__方法中的get_conn()注释掉,再在add_one()和get_one()的第一行调用get_one()获取连接,在最后一行调用 close_conn()关闭连接(用之前获取,用完了关闭),这样就可以了。022018-03-25 -
NavCat
2018-03-25
第四步,审查代码。你的class命名不规范.不要驼峰命名和_混用,四不像的感觉,除非特殊情况。
012018-03-25 -
JasonHsia
提问者
2018-03-25
import MySQLdb class Mysql_search(): def __init__(self, page=1, pagesize=20): self.get_conn() self.page = page self.pagesize = pagesize def get_conn(self): # 进行连接 try: self.conn = MySQLdb.connect( host="127.0.0.1", # localhost也可以用本机IP地址 user='root', # 也可以用别的用户 passwd='0223', db='news', port=3306, charset='utf8' ) except MySQLdb.Error as e: print('Error:%s' % e) def close_conn(self): try: if self.conn: #关闭连接 self.conn.close() except MySQLdb.Error as e: print('Error:%s' % e) def get_one(self): #准备SQL,找到游标,执行SQL,拿到数据,处理数据,关闭游标,关闭连接 sql = 'SELECT * FROM `news` WHERE `types` = %s ORDER BY `create_time` DESC;' cursor = self.conn.cursor() cursor.execute(sql, ('bule',)) result = cursor.fetchone() #cursor.rowcount 统计行数 dir(cursor) 显示帮助文档 #由于这里得到的是元组结果不便查询,可以用如下方式转型, cursor.description会得到一个矩阵,第一列为各标题 result = dict(zip([k[0] for k in cursor.description], result)) cursor.close() self.close_conn() return result def get_more(self): offset = (self.page - 1) * self.pagesize # 准备SQL,找到游标,执行SQL,拿到数据,处理数据,关闭游标,关闭连接 sql = 'SELECT * FROM `news` WHERE `types` = %s ORDER BY `create_time` DESC LIMIT %s, %s;' cursor = self.conn.cursor() cursor.execute(sql, ('bule', offset, self.pagesize)) result = cursor.fetchall() # 这个得到的是列表 # cursor.rowcount 统计行数 dir(cursor) 显示帮助文档 # 由于这里得到的是元组结果不便查询,可以用如下方式转型, cursor.description会得到一个矩阵 resu = [] for i in range(len(result)): resu.append(dict(zip([k[0] for k in cursor.description], result[i]))) # resu = [dict(zip([k[0] for k in cursor.description], row)) for row in result] cursor.close() self.close_conn() return resu def add_one(self): # try: #准备SQL,获取连接和游标,提交数据,提交事务,关闭游标和连接 sql = "INSERT INTO `news` (`title`, `image`, `content`,`types`, `is_valid`) VALUE (%s, %s, %s, %s, %s);" cursor = self.conn.cursor() cursor.execute(sql, ('标题1', r"D:\userdir\Pictures\其它\1.jpg", '新闻内容', '推荐', 1)) self.conn.commit() #非常重要,相当于刷新提交表格 cursor.close() # except: # print('error') #这种情况不会添加数据 # self.conn.commit() 这种情况只会添加正确数据 # self.conn.rollback() self.close_conn() def main(): obj = Mysql_search() result = obj.get_more() print(result) obj.add_one() #conn关闭之后再次执行会报错,所以目前还不能同时使用 if __name__ == '__main__': main()
Traceback (most recent call last):
File "D:/python/mysql_study/connect.py", line 84, in <module>
main()
File "D:/python/mysql_study/connect.py", line 81, in main
obj.add_one() #conn关闭之后再次执行会报错,所以目前还不能同时使用
File "D:/python/mysql_study/connect.py", line 67, in add_one
cursor.execute(sql, ('标题1', r"D:\userdir\Pictures\其它\1.jpg", '新闻内容', '推荐', 1))
File "C:\Python3\lib\site-packages\MySQLdb\cursors.py", line 250, in execute
self.errorhandler(self, exc, value)
File "C:\Python3\lib\site-packages\MySQLdb\connections.py", line 50, in defaulterrorhandler
raise errorvalue
File "C:\Python3\lib\site-packages\MySQLdb\cursors.py", line 247, in execute
res = self._query(query)
File "C:\Python3\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
rowcount = self._do_query(q)
File "C:\Python3\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
db.query(q)
File "C:\Python3\lib\site-packages\MySQLdb\connections.py", line 277, in query
_mysql.connection.query(self, query)
_mysql_exceptions.InterfaceError: (0, '')
老师,大概就是这样,mian()里面的get_more和add_one运行其中任意一个都没问题。然后如果add_one里的try,except使用的话就不会报错了,所以我给注释掉了。
00 -
NavCat
2018-03-25
贴一下你的代码和运行截图,老师给你分析分析
012018-03-25
Python操作三大主流数据库-MySQL+MongoDB+Redis
2024 学习 · 376 问题
相似问题