python 操作MySQL数据库

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

文章目录


1. 安装 PyMySQL

2. 连接对象

3. 游标对象

4. 增删改操作

cursor.execute(sql)

cursor.executemany(sql, seq_of_params)

5. 查询操作

6. ORM编程

常用 python ORM 库

learning from 《python web开发从入门到精通》


1. 安装 PyMySQL


conda 虚拟环境下安装 pip install pymysql


2. 连接对象


创建连接的一个 object

import pymysql
try:
    connection = pymysql.connect(
        host='localhost',
        user='root',
        password='123456',
        db='michaeldata',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor  # 游标类型
    )
    print("连接成功:", connection)
except Exception as e:
    print("连接失败:", e)

输出:连接成功: <pymysql.connections.Connection object at 0x00000205AC8E96D0>


成功连接后,获取的连接对象,有很多方法,常用的如下:


cursor() 获取游标对象,操作数据库

commit() 提交事务

rollback() 回滚事务

close() 关闭数据库连接


3. 游标对象


cursor = connection.cursor()

游标对象的常用方法:


execute(operation, [, param]) 执行数据库操作,SQL语句

executemany(operation, 参数序列) 批量执行操作

fetchone() 获取查询结果集里的下一条

fetchmany(size) 获取指定数量的记录

fetchall() 获取所有记录

close() 关闭游标

操作流程实例:

import pymysql
try:
    connection = pymysql.connect(
        host='localhost',
        user='root',
        password='123456',
        db='michaeldata',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor  # 游标类型
    )
    print("连接成功:", connection)
except Exception as e:
    print("连接失败:", e)
# sql 语句
sql = '''
create table books(
    id int not null auto_increment,
    name varchar(255) not null,
    category varchar(50) not null,
    price decimal(10, 2) default '0',
    publish_time date default null,
    primary key (id)
) engine = InnoDB auto_increment=1 
default charset = utf8mb4 collate = utf8mb4_0900_ai_ci;
'''
cursor = connection.cursor()  # 获取游标对象
cursor.execute(sql)  # 执行sql语句
cursor.close()  # 先关闭游标
connection.close()  # 再关闭连接,或者使用 with as

image.png


4. 增删改操作


  • 对于 增删改 ,使用 cursor.execute() 执行 SQL 语句后,默认不会自动提交,要使用 connection.commit() 提交
  • insert 语句使用 %s 作为占位符,可以防止 SQL注入

cursor.execute(sql)

import pymysql
try:
    connection = pymysql.connect(
        host='localhost',
        user='root',
        password='123456',
        db='michaeldata',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor  # 游标类型
    )
    print("连接成功:", connection)
except Exception as e:
    print("连接失败:", e)
# sql 语句
sql = '''
create table if not exists books(
    id int not null auto_increment,
    name varchar(255) not null,
    category varchar(50) not null,
    price decimal(10, 2) default '0',
    publish_time date default null,
    primary key (id)
) engine = InnoDB auto_increment=1 
default charset = utf8mb4 collate = utf8mb4_0900_ai_ci;
'''
cursor = connection.cursor()  # 获取游标对象
cursor.execute(sql)  # 执行sql语句
sql1 = 'insert into books(name, category, price, publish_time) values("python web开发", "python", "98.8", "2020-01-01")'
cursor.execute(sql1)  # 执行sql语句
connection.commit()  # connection 提交才能生效
cursor.close()  # 先关闭游标
connection.close()  # 再关闭连接,或者使用 with as

image.png


cursor.executemany(sql, seq_of_params)

批量操作

import pymysql
try:
    connection = pymysql.connect(
        host='localhost',
        user='root',
        password='123456',
        db='michaeldata',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor  # 游标类型
    )
    print("连接成功:", connection)
except Exception as e:
    print("连接失败:", e)
# sql 语句
sql = '''
create table if not exists books(
    id int not null auto_increment,
    name varchar(255) not null,
    category varchar(50) not null,
    price decimal(10, 2) default '0',
    publish_time date default null,
    primary key (id)
) engine = InnoDB auto_increment=1 
default charset = utf8mb4 collate = utf8mb4_0900_ai_ci;
'''
cursor = connection.cursor()  # 获取游标对象
cursor.execute(sql)  # 执行sql语句
# sql1 = 'insert into books(name, category, price, publish_time) values("python web开发", "python", "98.8", "2020-01-01")'
# cursor.execute(sql1)  # 执行sql语句
# connection.commit()  # connection 提交才能生效
# 数据列表
data = [("零基础学Python", 'Python', '79.80', '2018-5-20'),
        ("Python从入门到精通", 'Python', '69.80', '2018-6-18'),
        ("零基础学PHP", 'PHP', '69.80', '2017-5-21'),
        ("PHP项目开发实战入门", 'PHP', '79.80', '2016-5-21'),
        ("零基础学Java", 'Java', '69.80', '2017-5-21'),
        ]
try:
    cursor.executemany('insert into books(name, category, price, publish_time) values(%s, %s, %s, %s)', data)
    connection.commit()  # connection 提交才能生效
except Exception as e:
    connection.rollback()  # 回滚
cursor.close()  # 先关闭游标
connection.close()  # 再关闭连接,或者使用 with as

image.png


5. 查询操作


  • 执行 select 查询,生成结果集,然后使用 fetchone/fetchmany/fetchall () 相关语句获取记录
import pymysql
try:
    connection = pymysql.connect(
        host='localhost',
        user='root',
        password='123456',
        db='michaeldata',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor  # 游标类型
    )
    print("连接成功:", connection)
except Exception as e:
    print("连接失败:", e)
# sql 语句
sql = "select * from books order by price"
with connection.cursor() as cursor:
    cursor.execute(sql)  # 执行sql语句
    result1 = cursor.fetchone()  # 获取查询结果
    result2 = cursor.fetchall()  # 获取查询结果
print(result1)
print("*" * 10)
for res in result2:
    print(res)
connection.close()  # 关闭连接

输出结果:

连接成功: <pymysql.connections.Connection object at 0x00000216C72696D0>
{'id': 5, 'name': 'Python从入门到精通', 'category': 'Python', 'price': Decimal('69.80'), 'publish_time': datetime.date(2018, 6, 18)}
**********
{'id': 6, 'name': '零基础学PHP', 'category': 'PHP', 'price': Decimal('69.80'), 'publish_time': datetime.date(2017, 5, 21)}
{'id': 8, 'name': '零基础学Java', 'category': 'Java', 'price': Decimal('69.80'), 'publish_time': datetime.date(2017, 5, 21)}
{'id': 4, 'name': '零基础学Python', 'category': 'Python', 'price': Decimal('79.80'), 'publish_time': datetime.date(2018, 5, 20)}
{'id': 7, 'name': 'PHP项目开发实战入门', 'category': 'PHP', 'price': Decimal('79.80'), 'publish_time': datetime.date(2016, 5, 21)}
{'id': 3, 'name': 'python web开发', 'category': 'python', 'price': Decimal('98.80'), 'publish_time': datetime.date(2020, 1, 1)}


6. ORM编程


ORM Object Relational Mapping 对象关系映射


它把 数据库 映射为 对象


table - class

record - object

field - attribute

ORM 示例写法 data = Book.query.all()


好处:


数据模型利于重用代码

有很多现成工具完成预处理,事物等

基于 ORM 的业务代码简单语义好,易理解

不必编写性能不佳的 sql

缺点:


ORM 库不是轻量级工具,学习成本高

复杂的查询,无法表达 或者 性能不如原生SQL

ORM 抽象掉了数据库层,无法了解底层操作,也就无法定制特殊的SQL

常用 python ORM 库

Django ORM,跟 Django 结合紧密

SQLAlchemy比较成熟

Peewee轻量级,基于SQLAlchemy开发

Storm 中型,允许跨数据库查询


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
22天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
1天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL与NoSQL的主要区别在于数据结构、查询语言和可扩展性。MySQL是关系型数据库,依赖预定义的数据表结构,使用SQL进行复杂查询,适合垂直扩展。而NoSQL提供灵活的存储方式(如JSON、哈希表),无统一查询语言,支持横向扩展,适用于处理大规模、非结构化数据和高并发场景。选择哪种取决于应用需求、数据模型及扩展策略。
7 0
|
1天前
|
SQL 关系型数据库 MySQL
第十三章 Python数据库编程
第十三章 Python数据库编程
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
2天前
|
JSON 数据格式 索引
python 又一个点运算符操作的字典库:Munch
python 又一个点运算符操作的字典库:Munch
19 0
|
6天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
126 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
6天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
7天前
|
索引 Python
如何使用Python的Pandas库进行数据透视表(pivot table)操作?
使用Pandas在Python中创建数据透视表的步骤包括:安装Pandas库,导入它,创建或读取数据(如DataFrame),使用`pd.pivot_table()`指定数据框、行索引、列索引和值,计算聚合函数(如平均分),并可打印或保存结果到文件。这允许对数据进行高效汇总和分析。
10 2
|
12天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。