Python数据库查询:cur.fetchall与cur.fetchone提取及统计处理

月亮慢半拍
月亮慢半拍
发布时间:2026-10-12| 7人浏览过
原创

本文详解Python中pymysql库的cur.fetchall与cur.fetchone方法。通过连接MySQL数据库,演示如何提取数据并利用pandas进行分组统计、映射编码、排序及格式转换,最终输出前端所需JSON格式。同时对比fetchone在单行查询中的应用,提供完整的代码示例与结果分析。

数据库字段与编码生成

在数据处理场景中,数据库字段 type_code 通常包含中文类型和对应的编码。这些编码由32位随机字符组成,包含字母、数字及特殊字符。例如:

{
    'ys4ng35toofdviy9ce0pn1uxw2x7trjb': '娱乐',
    'vekgqjtw3ax20udsniycjv1hdsa7t4oz': '经济',
    'vjzy0fobzgxkcnlbrsduhp47f8pxcoaj': '军事',
    'uamwbfqlxo7bu0warx6vkhefigkhtoz3': '政治',
    'lyr1hbrnmg9qzvwuzlk5fas7v628jiqx': '文化'
}

生成此类32位随机编码的代码如下:

import string
import random

def get_code():
    return ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 32))

print(get_code())

def get_code1():
    return ''.join(random.sample(string.ascii_letters + string.digits, 32))

testresult = get_code1()
print(testresult.lower())
print(type(testresult))

运行结果示例:

)@+t37/b|UQ[K;!spj<(>%r9"PokwTe=
igwle98kgqtcprke7byvq12xnhucmz4v
<class 'str'>

使用 cur.fetchall 提取并统计数据

cur.fetchall() 用于提取所有查询结果,返回一个包含多个元组的列表。以下是连接数据库并执行分组统计的完整流程:

1. 建立数据库连接

import pymysql
import pandas as pd 

conn = pymysql.Connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123456",
    charset="utf8",
    db="sql_prac"
)
cur = conn.cursor()
print("连接成功")

2. 执行查询并提取数据

通过 GROUP BY 对 type_code 进行分组统计,并按数量降序排列:

sql = "SELECT type_code, count(1) as num FROM test GROUP BY type_code ORDER BY num desc"
cur.execute(sql)
res = cur.fetchall()
print(res)

原始结果示例:

(
    ('ys4ng35toofdviy9ce0pn1uxw2x7trjb', 8),
    ('vekgqjtw3ax20udsniycjv1hdsa7t4oz', 5),
    ('vjzy0fobzgxkcnlbrsduhp47f8pxcoaj', 3),
    ('uamwbfqlxo7bu0warx6vkhefigkhtoz3', 3),
    ('娱乐', 2),
    ('lyr1hbrnmg9qzvwuzlk5fas7v628jiqx', 1),
    ('政治', 1),
    ('经济', 1),
    ('军事', 1),
    ('文化', 1)
)

3. 数据映射与转换

将提取的元组转换为 pandas.DataFrame,并利用字典映射将编码替换为中文名称:

dicts = {
    'ys4ng35toofdviy9ce0pn1uxw2x7trjb': '娱乐',
    'vekgqjtw3ax20udsniycjv1hdsa7t4oz': '经济',
    'vjzy0fobzgxkcnlbrsduhp47f8pxcoaj': '军事',
    'uamwbfqlxo7bu0warx6vkhefigkhtoz3': '政治',
    'lyr1hbrnmg9qzvwuzlk5fas7v628jiqx': '文化'
}

res_df = pd.DataFrame(list(res), columns=['name', 'value'])
res_df['name'] = res_df['name'].map(lambda x: dicts[x] if x in dicts else x)
print(res_df)

映射后的 DataFrame:

   name  value
0   娱乐      8
1   经济      5
2   军事      3
3   政治      3
4   娱乐      2
5   文化      1
6   政治      1
7   经济      1
8   军事      1
9   文化      1

4. 分组统计与排序

按名称分组求和,并重置索引:

result = res_df.groupby(['name']).sum().reset_index()
print(result)

统计结果:

   name  value
0   军事      4
1   娱乐     10
2   政治      4
3   文化      2
4   经济      6

按 value 降序排序:

result = result.sort_values(['value'], ascending=False)
print(result)

5. 输出为前端所需格式

将结果转换为字典列表,便于前端接收:

data_dict = result.to_dict(orient='records')
print(data_dict)

最终输出:

[
    {'name': '娱乐', 'value': 10},
    {'name': '经济', 'value': 6},
    {'name': '军事', 'value': 4},
    {'name': '政治', 'value': 4},
    {'name': '文化', 'value': 2}
]

使用 cur.fetchone 提取单行数据

cur.fetchone() 返回单个元组或 None,适用于只需获取一行结果的场景。以下示例通过 SQL 的 CASE WHEN 语句直接统计各类别数量:

import pymysql
import pandas as pd

conn = pymysql.Connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123456",
    charset="utf8",
    db="sql_prac"
)
cur = conn.cursor()
print("连接成功")

sql = (
    "SELECT "
    "count(case when type_code in ('ys4ng35toofdviy9ce0pn1uxw2x7trjb','娱乐') then 1 end) 娱乐, "
    "count(case when type_code in ('vekgqjtw3ax20udsniycjv1hdsa7t4oz','经济') then 1 end) 经济, "
    "count(case when type_code in ('vjzy0fobzgxkcnlbrsduhp47f8pxcoaj','军事') then 1 end) 军事, "
    "count(case when type_code in ('uamwbfqlxo7bu0warx6vkhefigkhtoz3','政治') then 1 end) 政治, "
    "count(case when type_code in ('lyr1hbrnmg9qzvwuzlk5fas7v628jiqx','文化') then 1 end) 文化 "
    "FROM test"
)
cur.execute(sql)
res = cur.fetchone()
print(res)

执行结果示例:

(10, 6, 4, 4, 2)

将结果转换为字典列表并排序:

data = [
    {"name": "娱乐", "value": res[0]},
    {"name": "经济", "value": res[1]},
    {"name": "军事", "value": res[2]},
    {"name": "政治", "value": res[3]},
    {"name": "文化", "value": res[4]}
]
result = sorted(data, key=lambda x: x['value'], reverse=True)
print(result)

最终输出:

[
    {'name': '娱乐', 'value': 10},
    {'name': '经济', 'value': 6},
    {'name': '军事', 'value': 4},
    {'name': '政治', 'value': 4},
    {'name': '文化', 'value': 2}
]

fetchone 与 fetchall 的区别

fetchone 返回单行记录,可通过索引(如 result[0])获取字段值;fetchall 返回多行记录的二维元组。例如:

cursor.execute("select username, password, nickname from user where id='%s'" % input)
fetchall = cursor.fetchall()

若执行 select * from user,fetchall 可能返回:

(
    ('username1', 'password1', 'nickname1'),
    ('username2', 'password2', 'nickname2'),
    ('username3', 'password3', 'nickname3')
)

以上就是Python中cur.fetchall与cur.fetchone提取数据并统计处理的详细内容,更多关于Python数据库操作、pandas数据处理及前端数据格式转换的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。