Python数据库查询:cur.fetchall与cur.fetchone提取及统计处理
本文详解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数据处理及前端数据格式转换的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













