当前位置:首页>python>运维开发宝典041-Python数据库模块和异常处理5

运维开发宝典041-Python数据库模块和异常处理5

  • 2026-10-11 05:52:43
运维开发宝典041-Python数据库模块和异常处理5

大家好,我是云计算磊哥,从业20年的IT老鸟。IT架构师培训15年,总结了一套从入门到精通的全运维开发宝典手册。准备用300天时间写一套博文,手把手从安装软件讲起,从linux系统管理,shell脚本编程,mysql运维架构备份核心技术,Apache/nginx/tomcatWEB服务器管理,ansible自动化运维,redis集群哨兵,LVM/HAproxy/keepalived集群架构,rabbitMQ消息队列,docker&K8S集群资源管理,K8S自愈,K8S自动扩容,PYTHON编程基础,PYTHON自动化运维,从行业到产品,从过去到未来,从理论到操作,从视频到文档工具,100+篇系列文章一站式发布。从零基础入门到30k运维开发工程师岗位诸多就业问题。多方位全方面的给你讲清楚云计算这个行业该如何做。关注我。后续AI大模型开发课程更精彩。


十三、Python3 操作数据库

1、Python3 操作 MySQL

1、基本介绍

  • Python3 操作 MySQL 数据库 可以使用的模块是 pymysql 和 MySQLdb。

  • 这个两个模块都是通过自己的 API 执行原生的 SQL 语句实现的。

  • MySQLdb 是最早出现的一个操作 MySQL 数据库的模块,核心由C语言编写,接口精炼,性能最棒,缺点是环境依赖较多,安装稍复杂,近两年已停止更新,且只支持Python2.x,不支持Python3.x。

  • pymysql 为替代 MySQLdb 而生,纯 Python 实现,API 的接口与 MySQLdb 完全兼容,安装方便,支持Python3。

  • 2020 已经离我们很近了,所以,我们这里只聊 pymysql

2、 安装包 pymysql

pymysql是Python中操作MySQL的模块(Linux 机器)

pip3 install pymysql

3、 基本操作

1、创建表
import pymysql 创建连接conn = pymysql.connect(host='172.16.153.10',                       port=3306,                       user='root',                       passwd='123',                        db='shark_db',                       charset='utf8mb4')mysql -uroot -p'password' -h host_ip databasename获取游标对象cursor = conn.cursor()mysql>定义 sql 语句create_table_sql = """create table test1 (id int auto_increment primary key,   name varchar(10) not null,   age int not null)"""执行 sql 语句cursor.execute(create_table_sql)mysql>select * from mysql.user提交conn.commit()commit;关闭游标对象cursor.close()exit()关闭连接对象conn.close()exit()
2、插入数据

一次插入一条数据

一次插入一条数据, 并且使用变量占位符insert_data_sql = "insert into t1(name, age) values(%s, %s);"row = cursor.execute(insert_data_sql, ('shark', 18))conn.commit()cursor.close()conn.close()

一次插入多条数据

定义插入数据的语句many_sql = "insert into t1 (name, age) values(%s, %s)"一次插入多条数据row = cursor.executemany(many_sql, [('shark1', 18),('xiguatian', 20),('qf', 8)])conn.commit()cursor.close()conn.close()
3、查询数据
1、获取到的数据是元组类型
定义一个查询语句query_sql = "select id,name,age from t1 where name=%s;"执行查询语句,并且返回得到结果的行数row_nums = cursor.execute(query_sql, ('shark2'))"""获取到数据结果集具有迭代器的特性:1. 可以通过索引取值,可以切片2. 结果集中的数据每次取出一条就少一条"""获取数据中的第一条one_data = cursor.fetchone()获取数据中的指定数量的条目many_data = cursor.fetchmany(2)获取数据中剩余的全部数据all_data = cursor.fetchall()cursor.close()conn.close()print(row_nums)print(one_data)print(many_data)print(all_data)
2、获取到的数据是字典类型的
游标设置为字典类型cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)query_sql = "select id,name,age from t1 where name=%s;"row_nums = cursor.execute(query_sql, ('shark2'))获取结果的操作和之前的一样result = cursor.fetchone()conn.commit()cursor.close()conn.close()print(result)

十四、异常处理

1、什么是异常

异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),所以,在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面或者信息,在python中,错误触发的异常如下:

2、而错误分成以下两种情况

1、语法错误

#语法错误一if#语法错误二def test:    pass#语法错误三class Foo    pass#语法错误四print(haha

2、非语法错误

# TypeError:int类型不可迭代for i in 3:    pass# ValueErrorinp=input(">>: ") # 输入 qfint(inp)# NameErroraaa# IndexErrorl=['yangge','aa']l[3]# KeyErrordic={'name':'yangge'}dic['age']# AttributeErrorclass Foo:    passFoo.x# ZeroDivisionError:无法完成计算res1=1/0

3、异常的种类

在python中不同的异常可以用不同的类型(python3中统一了类与类型,类型即类)去标识,一个异常标识一种错误,python中的异常种类非常多,每个异常专门用于处理某一项异常

# 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性xAttributeError # 输入/输出异常;基本上是无法打开文件IOError # 无法导入模块或包;基本上是路径问题或名称错误ImportError # 语法错误(的子类) ;代码没有正确对齐IndentationError # 下标索引超出序列边界,比如当 li 只有三个元素,却试图访问 li[5]IndexError # 试图访问字典里不存在的键KeyError #  按了一下 Ctrl+CKeyboardInterrupt# 使用一个还未被赋予对象的变量NameError # 无效语法,语法错误SyntaxError # 传入对象类型不符合要求,如sum 函数需要的是 int,但你传入了 strTypeError # 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它UnboundLocalError # 例如:"""x = 1def func():    x += 1    return xfunc()UnboundLocalError: local variable 'x' referenced before assignment# 局部变量 x 在赋值之前被引用"""# 传入一个调用者不期望的值,即使值的类型是正确的,比如 int('a')ValueError #python中全部的异常类型ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError

4、异常处理

为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,

如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防

def func(arg):        if arg is int:            arg += 1        else:            arg = int(arg)            arg += 1        return arg

如果错误发生的条件是不可预知的,则需要用到try…except:在错误发生之后进行处理

1、基本语法为

try:    被检测的代码块except 异常类型 as 异常信息变量名:    try中一旦检测到异常,就执行这个位置的逻辑

例子

def func(arg):    try:        arg +=1    except TypeError as e:        print(e)func('磊哥')

2、使用正确的异常类型

异常处理,只可以捕获到声明的异常种类和发生异常的种类相匹配的情况。 假如发生的异常类型和你指定捕获到异常不能匹配,就无法处理。

x = '磊哥'try:    int(x)except IndexError as e: # 未捕获到异常,程序直接报错    print(e)

3、处理异常的多分支操作

x = '磊哥'try:    int(x)except IndexError as e:    print(e)except KeyError as e:    print(e)except ValueError as e:    print(e)

4、万能异常 Exception

x = '磊哥'try:    int(x)except Exception as e:    print(e)

5、多分支异常与万能异常结合使用

假如对于不同种类的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。 也可以在多分支的最后写一个Exception

x = '磊哥'try:    x[3]except IndexError as e:    print(e)except KeyError as e:    print(e)except ValueError as e:    print(e)except Exception as e:    print(e)

6、或者无论出现什么异常,都统一丢弃,或者使用同一段代码逻辑去处理

所有的异常! 只有一个Exception就足够了,这是不好的做法。

try:    print('a'[3])except Exception as e:    print(e)

7、异常的其他结构

x = '磊哥'try:    int(x)except IndexError as e:    print(e)except KeyError as e:    print(e)except ValueError as e:    print(e)else:    print('try内代码块没有异常则执行我')finally:    print('无论异常与否,都会执行该模块,通常是进行清理工作')#如果try中没有异常,那么except部分将跳过,执行else中的语句。(前提是try里没有返回值)#finally是无论是否有异常,最后都要做的一些事情。”(无论try里是否有返回值)

8、主动触发异常

try:    raise TypeError('类型错误')except Exception as e:    print(e)helper.pydef f1():    print('f1')index.pyimport helperif __name__ == '__main__'try:        n = '1'        n = int(n)        ret = helper.f1()        if ret:            print('成功')        else:            raise Exception('调用失败')    except Exception,e:        print('出现错误')        print(e)

最新文章

随机文章