python 数据库查询返回list或tuple

本文介绍如何将MySQL查询结果从默认的tuple类型转换为dict类型,提高数据处理的便捷性,并提供具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.DictCursor就行。

默认程序:

import MySQLdb
db  = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='test')
cur = db.cursor()
cur.execute('select * from user')
rs = cur.fetchall()
print rs
# 返回类似如下
# ((1000L, 0L), (2000L, 0L), (3000L, 0L))

修改后:

import MySQLdb
import MySQLdb.cursors
db = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='test',
                     cursorclass=MySQLdb.cursors.DictCursor)
cur = db.cursor()
cur.execute('select * from user')
rs = cur.fetchall()
print rs
# 返回类似如下
# ({'age': 0L, 'num': 1000L}, {'age': 0L, 'num': 2000L}, {'age': 0L, 'num': 3000L})

或者也可以用下面替换connect和cursor部分

db  = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='test')
cur = db.cursor(cursorclass=MySQLdb.cursors.DictCursor)

我的实践:

输出为元组类型:

import pymysql

db = pymysql.connect("localhost", "root", "123456", "filestore")
cursor = db.cursor()
sql='select * from tablelist where id>%s' %4
#查询方法一
cursor.execute(sql)
result=cursor.fetchall()
print('result',result)

sql2='select * from tablelist where id>%s'
values=('4')  # 此处为元组类型
#查询方法二
cursor.execute(sql2,values)
result2=cursor.fetchall()
print('result2',result2)
id_list=[]
tablename_list=[]
tabletime_lsit=[]
cursor.execute('select * from tablelist where id>%s',[4,])
result3=cursor.fetchall()
print('type(result3)',type(result3))
#对((6, 'engineeringdata20180901', '1535731200'),)类型数据的提取
for i in range(len(result3)):
    id_list.append(result3[i][0])
    tablename_list.append(result3[i][1])
    tabletime_lsit.append(result3[i][2])
print(id_list)
print(tabletime_lsit)
print(tablename_list)
cursor.close()
db.close()
#输出结果:
result ((6, 'engineeringdata20180901', '1535731200'), (618, 'engineeringdata20180904', '1535990400'))
result2 ((6, 'engineeringdata20180901', '1535731200'), (618, 'engineeringdata20180904', '1535990400'))
type(result3) <class 'tuple'>
[6, 618]
['1535731200', '1535990400']
['engineeringdata20180901', 'engineeringdata20180904']

输出为list类型:

list_id=[]
list_tablename=[]
list_tabletime=[]
list=get_list('select * from tablelist where id>%s',[4])
print('list:',list)
# 对[{'id': 6, 'tablename': 'engineeringdata20180901', 'tabletime': '1535731200'},]类型数据的提取
for i in range(len(list)):
    print(list[i])
    list_id.append(list[i]['id'])
    list_tablename.append(list[i]['tablename'])
    list_tabletime.append(list[i]['tabletime'])
print('list_id:',list_id)
print('list_tabletime:',list_tabletime)
print('list_tablename:',list_tablename)
# 输出结果为:
list: [{'id': 6, 'tablename': 'engineeringdata20180901', 'tabletime': '1535731200'}, {'id': 618, 'tablename': 'engineeringdata20180904', 'tabletime': '1535990400'}]
{'id': 6, 'tablename': 'engineeringdata20180901', 'tabletime': '1535731200'}
{'id': 618, 'tablename': 'engineeringdata20180904', 'tabletime': '1535990400'}
list_id: [6, 618]
list_tabletime: ['1535731200', '1535990400']
list_tablename: ['engineeringdata20180901', 'engineeringdata20180904']

 

### Python 数据库操作封装的方法 对于Python连接并操作多种类型的数据库(如MySQL、SQL Server、Oracle以及PostgreSQL),可以采用统一的方式来进行封装,从而简化开发流程并提升代码复用率。为了达到这一目标,通常会创建一个专门用于处理不同种类数据库连接及查询执行的基础类。 #### 使用`DBUtils`作为通用解决方案 一种常见的做法是利用现有的开源项目——比如 `dbutils` ,它提供了持久化管理器模式下的线程安全连接池功能[^1]。然而,在实际应用中更常见的是开发者基于特定需求自定义适合自己的轻量级工具包。 #### 自定义简易版ORM框架 考虑到灵活性与性能之间的平衡,很多情况下会选择构建一套简易的对象关系映射(ORM)机制来抽象底层SQL逻辑。下面是一个针对 MySQL 的例子: ```python import pymysql class MysqlHelper(object): def __init__(self, host='localhost', port=3306, user=None, password=None, database=None): self.host = host self.port = port self.user = user self.password = password self.database = database def get_conn(self): conn = pymysql.connect( host=self.host, port=int(self.port), user=self.user, passwd=self.password, db=self.database, charset="utf8" ) return conn def execute_sql(self, sql_str, params=None): try: with self.get_conn() as connection: cursor = connection.cursor() if isinstance(params, (list,tuple)): affected_rows = cursor.executemany(sql_str,params) elif params is not None: affected_rows = cursor.execute(sql_str,params) else: affected_rows = cursor.execute(sql_str) result_set = [] if 'select' in sql_str.lower(): columns = [desc[0] for desc in cursor.description] rows = cursor.fetchall() for row in rows: item_dict = dict(zip(columns,row)) result_set.append(item_dict) connection.commit() return {"affected": affected_rows,"data":result_set} except Exception as e: raise RuntimeError(f"Error executing SQL statement {e}") ``` 上述代码片段展示了如何通过继承对象的方式来建立与 MySQL 数据库间的交互接口,并实现了基本的 CRUD 功能[^3]。值得注意的是,这段程序还考虑到了异常情况的发生,并采取了相应的措施确保事务的一致性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chde2Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值