第十三章 Python数据库编程

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

本章节讲解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,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
485 7
|
4月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
341 102
|
4月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
364 104
|
4月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
291 103
|
4月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
215 82
|
3月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
300 3
|
3月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
539 3
|
3月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
347 3
|
4月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
3月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
386 0

推荐镜像

更多