第十三章 Python数据库编程

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

本章节讲解Python操作数据库,完成简单的增删改查工作,以MySQL数据库为例。

Python的MySQL数据库操作模块叫MySQLdb,需要额外的安装下。

通过pip工具安装:pip install MySQLdb

MySQLdb模块,我们主要就用到连接数据库的方法MySQLdb.Connect(),连接上数据库后,再使用一些方法做相应的操作。

MySQLdb.Connect(parameters...)方法提供了以下一些常用的参数:

参数

描述

host 数据库地址
user 数据库用户名,
passwd 数据库密码,默认为空
db 数据库库名,没有默认库
port 数据库端口,默认3306
connect_timeout 连接超时时间,秒为单位
use_unicode 结果以unicode字符串返回
charset 插入数据库编码

连接对象返回的connect()函数:

commit() 提交事务。对支持事务的数据库和表,如果提交修改操作,不适用这个方法,则不会写到数据库中
rollback() 事务回滚。对支持事务的数据库和表,如果执行此方法,则回滚当前事务。在没有commit()前提下。
cursor([cursorclass]) 创建一个游标对象。所有的sql语句的执行都要在游标对象下进行。MySQL本身不支持游标,MySQLdb模块对其游标进行了仿真。

游标对象也提供了几种方法:

close() 关闭游标
execute(sql) 执行sql语句
excutemany(sql) 执行多条sql语句
fetchone() 从执行结果中取第一条记录
fetchmany(n) 从执行结果中取n条记录
fetchall() 从执行结果中取所有记录
scroll(self, value, mode='relative') 游标滚动


博客地址:http://lizhenliang.blog.51cto.com

QQ群:323779636(Shell/Python运维开发群


13.1 数据库增删改查

13.1.1 在test库创建一张user表,并添加一条记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> conn  =  MySQLdb.Connect(host = '192.168.1.244' ,user = 'root' ,passwd = 'QHyCTajI' ,db = 'test' ,charset = 'utf8' )
>>> cursor  =  conn.cursor()
>>> sql  =  "create table user(id int,name varchar(30),password varchar(30))"
>>> cursor.execute(sql)    # 返回的数字是影响的行数
0L    
>>> sql  =  "insert into user(id,name,password) values('1','xiaoming','123456')"
>>> cursor.execute(sql)
1L
>>> conn.commit()   # 提交事务,写入到数据库
>>> cursor.execute( 'show tables' )   # 查看创建的表
1L
>>> cursor.fetchall()   # 返回上一个游标执行的所有结果,默认是以元组形式返回
((u 'user' ,),)
>>> cursor.execute( 'select * from user' )           
1L
>>> cursor.fetchall()
(( 1L , u 'xiaoming' , u '123456' ),)

13.1.2 插入多条数据

1
2
3
4
5
6
7
8
9
10
>>> sql  =  'insert into user(id,name,password) values(%s,%s,%s)'
>>> args  =  [( '2' , 'zhangsan' , '123456' ), ( '3' , 'lisi' , '123456' ),( '4' , 'wangwu' , '123456' )] 
>>> cursor.executemany(sql, args)
3L
>>> conn.commit()
>>> sql  =  'select * from user'
>>> cursor.execute(sql)
4L
>>> cursor.fetchall()
(( 1L , u 'xiaoming' , u '123456' ), ( 2L , u 'zhangsan' , u '123456' ), ( 3L , u 'lisi' , u '123456' ), ( 4L , u 'wangwu' , u '123456' ))

args变量是一个包含多元组的列表,每个元组对应着每条记录。当查询多条记录时,使用此方法,可有效提高插入效率。

13.1.3 删除用户名xiaoming的记录

1
2
3
4
5
6
7
8
9
>>> sql  =  'delete from user where name="xiaoming"'
>>> cursor.execute(sql)                           
1L
>>> conn.commit()
>>> sql  =  'select * from user'                   
>>> cursor.execute(sql)       
3L
>>> cursor.fetchall()         
(( 2L , u 'zhangsan' , u '123456' ), ( 3L , u 'lisi' , u '123456' ), ( 4L , u 'wangwu' , u '123456' ))

13.1.4 查询记录

1
2
3
4
5
6
7
8
9
10
>>> sql  =  'select * from user' 
>>> cursor.execute(sql)         
3L
>>> cursor.fetchone()    # 获取第一条记录
( 2L , u 'zhangsan' , u '123456' )
>>> sql  =  'select * from user' 
>>> cursor.execute(sql)         
3L
>>> cursor.fetchmany( 2 # 获取两条记录
(( 2L , u 'zhangsan' , u '123456' ), ( 3L , u 'lisi' , u '123456' ))

13.1.4 以字典形式返回结果

默认显示是元组形式,要想返回字典形式,使得更易处理,就用到cursor([cursorclass])中的cusorclass参数。

传入MySQLdb.cursors.DictCursor类:

1
2
3
4
5
6
>>> cursor  =  conn.cursor(MySQLdb.cursors.DictCursor)
>>> sql  =  'select * from user'
>>> cursor.execute(sql)
3L
>>> cursor.fetchall()
({ 'password' : u '123456' 'id' 2L 'name' : u 'zhangsan' }, { 'password' : u '123456' 'id' 3L 'name' : u 'lisi' }, { 'password' : u '123456' 'id' 4L 'name' : u 'wangwu' })

13.2 遍历查询结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import  MySQLdb
try :
     conn  =  MySQLdb.Connect(host = '127.0.0.1' , port = 3306 , user = 'root' , passwd = '123456' , connect_timeout = 3 , charset = 'utf8' )
     cursor  =  conn.cursor()
     sql  =  "select * from user"
     cursor.execute(sql)
     for  in  cursor.fetchall():
         print  i
except  Exception, e:
     print  ( "Connection Error: "  +  str (e))
finally :
     conn.close()
     
# python test.py
( 2L , u 'zhangsan' , u '123456' )
( 3L , u 'lisi' , u '123456' )
( 4L , u 'wangwu' , u '123456' )

使用for循环遍历查询结果,并增加了异常处理。




本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1874283,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
13天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
17天前
|
缓存 监控 Python
解密Python中的装饰器:优雅而强大的编程利器
Python中的装饰器是一种强大而又优雅的编程工具,它能够在不改变原有代码结构的情况下,为函数或类添加新的功能和行为。本文将深入解析Python装饰器的原理、用法和实际应用,帮助读者更好地理解和利用这一技术,提升代码的可维护性和可扩展性。
|
26天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
114 1
|
22天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
4天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
35 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
4天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
5天前
|
安全 数据处理 开发者
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
19 1
|
5天前
|
人工智能 数据挖掘 程序员
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
35 0
|
6天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
19 0