如何多次使用pymysql游标查询获取数据
时间: 2023-09-29 09:10:34 浏览: 185
您可以使用 pymysql.connect() 方法连接到 MySQL 数据库,并使用 cursor() 方法创建一个游标。然后,您可以执行 SQL 查询,并使用 fetchall() 方法获取所有匹配行的数据。最后,记得使用 close() 方法关闭游标和数据库连接。
以下是一个示例代码:
import pymysql
# 连接到数据库
conn = pymysql.connect(host='localhost', port=3306, user='root', password='password', database='mydb')
# 创建游标
cursor = conn.cursor()
# 执行 SQL 查询
cursor.execute('SELECT * FROM mytable')
# 获取所有匹配行的数据
data = cursor.fetchall()
# 输出结果
for row in data:
print(row)
# 关闭游标和连接
cursor.close()
conn.close()
请注意,此示例只是一个简单的演示。在实际应用中,您需要替换主机名、用户名、密码、数据库名和 SQL 查询,以匹配您的环境和需求。
相关问题
pymysql.cursors
pymysql.cursors模块是Python的pymysql库的一部分,它提供了一些游标对象,用于执行SQL查询并处理结果集。Pymysql库主要用于连接MySQL数据库,cursors模块的主要目的是为了增强与数据库交互的灵活性。
常见的Cursor对象有:
1. Cursor():这是最基本的游标,可以用来执行SQL语句,返回所有的查询结果。
2. DictCursor():将查询结果转换为字典,方便直接通过键访问数据。
3. SSDictCursor():同DictCursor,但它支持更高效的内存映射,对于大数据量的查询可能会更快。
4. BufferedCursor():缓冲区模式,对多次连续执行的简单查询进行优化,提高性能。
5. SSCursor():像SSDictCursor一样,同时也有缓存功能,但结果以元组形式返回。
使用这些cursor对象,你可以更方便地执行、遍历和管理数据库操作。例如:
```python
import pymysql.cursors
# 创建连接
connection = pymysql.connect(host='localhost', user='user', password='password', db='test')
try:
with connection.cursor(cursor=pymysql.cursors.DictCursor) as cursor:
# 执行查询,并以字典形式获取结果
cursor.execute("SELECT * FROM table")
results = cursor.fetchall()
for row in results:
print(row)
except:
pass
finally:
connection.close()
```
import pymysql import time while True: # 连接源数据库 src_conn = pymysql.connect(host='10.43.64.110', port=3306, user='selectuser', password='Xy@123456', database='messpdb') print("连接源数据库成功") # 连接目标数据库 dst_conn = pymysql.connect(host='10.43.144.231', port=3306, user='root', password='123456', database='czjsc') print("连接目标数据库成功") # 创建源游标对象 src_cursor = src_conn.cursor() # 创建目标游标对象 dst_cursor = dst_conn.cursor() # 编写SQL查询语句 #各牌号烟丝总重量 sql1 = 'select mat_id,material_name ,ROUND (sum(quantity) ,1 ) weight ,unit_id from messpdb.silk_stock a left join messpdb.maindata_material b on a.mat_id =b.ctrl where mat_id >0 group by mat_id,material_name, unit_id' sql2 = "select ROUND (sum(quantity) ,1 ) weight ,unit_id from messpdb.silk_stock a where mat_id >0 group by unit_id" sql3 = "select aa.ids,ROUND (aa.c1/bb.c2 ,3 )*100 from (select 1 as ids,count(box_code) c1 from messpdb.silk_stock a where mat_id >0 group by ids) aa, (select 1 as ids,count(box_code) c2 from messpdb.silk_stock a group by ids)bb where aa.ids=bb.ids" # 执行SQL查询语句 src_cursor.execute(sql1) src_cursor.execute(sql2) src_cursor.execute(sql3) # 获取查询结果 results1 = src_cursor.fetchall() results2 = src_cursor.fetchall() results3 = src_cursor.fetchall() print("查询数据库成功") # 更新数据到目标数据库 for row in results1: mat_id = row[0] material_name = row[1] weight = row[2] unit_id = row[3] # 将数据更新到目标数据库中 update_sql = "update cs_list set material_name=%s, weight=%s, unit_id=%s where mat_id=%s" dst_cursor.execute(update_sql, (material_name, weight, unit_id, mat_id)) print("更新数据成功") # 更新数据到目标数据库 for row in results2: weight = row[0] unit_id = row[1] # 将数据更新到目标数据库中 update_sql = "update cs2_list set weight=%s, unit_id=%s where id=1" dst_cursor.execute(update_sql, (weight, unit_id)) for row in results3: ids = row[0] stock_ratio = row[1] # 将数据更新到目标数据库中 update_sql = "update cs3_list set stock_ratio=%s where id=1" dst_cursor.execute(update_sql, stock_ratio) # 提交事务并关闭连接 dst_conn.commit() dst_cursor.close() src_cursor.close() dst_conn.close() src_conn.close() print("断开数据库连接成功") time.sleep(1) 帮我debug
在这段代码中,有几个问题需要修复:
1. `src_cursor.execute(sql1)`只执行了第一个SQL查询,后面的两个SQL查询也需要执行,可以将三个查询语句合并成一个查询语句,或者分别执行三次查询语句并将结果保存到不同的变量中。
2. 在更新数据到目标数据库时,对于第二个查询结果和第三个查询结果,更新语句中的where条件都是固定的,这样会导致每次更新都是更新同一行的数据,需要修改where条件。
3. 在更新数据到目标数据库之前,需要先将目标游标对象dst_cursor设置为可接受多条SQL语句,如下所示:
```
dst_cursor = dst_conn.cursor(pymysql.cursors.DictCursor)
```
4. 在更新数据到目标数据库之前,需要先将目标表中的数据清空,可以使用如下语句:
```
truncate_sql = "truncate table cs_list"
dst_cursor.execute(truncate_sql)
```
综上所述,修改后的代码如下所示:
```
import pymysql
import time
while True:
# 连接源数据库
src_conn = pymysql.connect(host='10.43.64.110', port=3306, user='selectuser', password='Xy@123456', database='messpdb')
print("连接源数据库成功")
# 连接目标数据库
dst_conn = pymysql.connect(host='10.43.144.231', port=3306, user='root', password='123456', database='czjsc')
print("连接目标数据库成功")
# 创建源游标对象
src_cursor = src_conn.cursor()
# 创建目标游标对象
dst_cursor = dst_conn.cursor(pymysql.cursors.DictCursor)
# 清空目标表中的数据
truncate_sql = "truncate table cs_list"
dst_cursor.execute(truncate_sql)
# 编写SQL查询语句
sql = '''
select a.mat_id, b.material_name, ROUND(sum(a.quantity), 1) as weight, a.unit_id
from messpdb.silk_stock a
left join messpdb.maindata_material b on a.mat_id = b.ctrl
where a.mat_id > 0
group by a.mat_id, b.material_name, a.unit_id;
select ROUND(sum(a.quantity), 1) as weight, a.unit_id
from messpdb.silk_stock a
where a.mat_id > 0
group by a.unit_id;
select aa.ids, ROUND(aa.c1 / bb.c2, 3) * 100 as stock_ratio
from (
select 1 as ids, count(box_code) as c1
from messpdb.silk_stock a
where a.mat_id > 0
group by ids
) aa, (
select 1 as ids, count(box_code) as c2
from messpdb.silk_stock a
group by ids
) bb
where aa.ids = bb.ids;
'''
# 执行SQL查询语句
src_cursor.execute(sql, multi=True)
# 获取查询结果
results = src_cursor.fetchall()
print("查询数据库成功")
# 更新数据到目标数据库
for row in results[0]:
mat_id = row["mat_id"]
material_name = row["material_name"]
weight = row["weight"]
unit_id = row["unit_id"]
# 将数据更新到目标数据库中
update_sql = "insert into cs_list (mat_id, material_name, weight, unit_id) values (%s, %s, %s, %s)"
dst_cursor.execute(update_sql, (mat_id, material_name, weight, unit_id))
for row in results[1]:
weight = row["weight"]
unit_id = row["unit_id"]
# 将数据更新到目标数据库中
update_sql = "update cs2_list set weight=%s, unit_id=%s where id=1"
dst_cursor.execute(update_sql, (weight, unit_id))
for row in results[2]:
ids = row["ids"]
stock_ratio = row["stock_ratio"]
# 将数据更新到目标数据库中
update_sql = "update cs3_list set stock_ratio=%s where id=1"
dst_cursor.execute(update_sql, stock_ratio)
# 提交事务并关闭连接
dst_conn.commit()
dst_cursor.close()
src_cursor.close()
dst_conn.close()
src_conn.close()
print("断开数据库连接成功")
time.sleep(1)
```
阅读全文