老师,3.4相关问题请教一下

来源:3-4 python更新mysql数据

JasonHsia

2018-03-25

如果get_one和add_one同时执行就会报错,单独执行的话都是没有问题的。报错信息是_mysql_exceptions.InterfaceError: (0, '') 这个情况可以避免吗

写回答

4回答

NavCat

2018-03-25

首先,定位问题。从错误里面可以看到报的是connection错误,也就是连接错误。
第二步,分析代码。在__init__方法中调用了get_conn()获得了连接,但是get_one时你调用了 close_conn()将连接关闭了,所以会报错。
第三步,解决问题。将__init__方法中的get_conn()注释掉,再在add_one()和get_one()的第一行调用get_one()获取连接,在最后一行调用 close_conn()关闭连接(用之前获取,用完了关闭),这样就可以了。

0
2
NavCat
回复
JasonHsia
哈哈,你也好棒,加油!
2018-03-25
共2条回复

NavCat

2018-03-25

第四步,审查代码。你的class命名不规范.不要驼峰命名和_混用,四不像的感觉,除非特殊情况。

0
1
JasonHsia
嗯嗯,谢谢老师指点!
2018-03-25
共1条回复

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使用的话就不会报错了,所以我给注释掉了。

0
0

NavCat

2018-03-25

贴一下你的代码和运行截图,老师给你分析分析

0
1
JasonHsia
老师,我放在回复里了,这样您看代码方便一点。
2018-03-25
共1条回复

Python操作三大主流数据库-MySQL+MongoDB+Redis

一次实战同时掌握Python操作MySQL,MongoDB,Redis 三大数据库使用技巧

2024 学习 · 376 问题

查看课程