十五、mysql(二)

curosr()

cursor游标是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以将游标当做一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

建立数据库连接之后,使用cursor提供的方法执行命令或者返回结果。

execute(self, query, args=None)
执行一个数据库sql命令。
executemany(self, query, args)
执行多个数据库sql命令。
callproc(self, procname, args=())
执行存储过程。

上述方法返回结果为受影响的行数。返回结果

fetchall(self)
接受全部的返回结果行。
fetchmany(self, size=None)
接受size条返回结果行。如果size值大于结果行的数量则返回cursor.arraysize条数据。
fetchone(self)
返回结果行的下一行。

上述方法返回结果为元组tuple。

import pymysql

def conn_mysql():
    db_config={
        'host': '127.0.0.1',
        'port': 3306,
        'user': 'root',
        'password': '123456',
        'db': 'mysql'
    }
    conn = pymysql.connect(**db_config)
    return conn

cnm = conn_mysql()
cus = cnm.cursor()
sql = 'select host,user from user'
try:
    cus.execute(sql)
    print(cus.fetchmany(size=1))    #输出结果:(('localhost', 'mysql.session'),)
    print(cus.fetchall())    #输出结果:(('localhost', 'mysql.sys'), ('localhost', 'root'))
    print(cus.fetchone())    #输出结果:None
    cus.close()    #关闭游标对象
    cnm.commit()    #正确则提交
except Exception as e:
    cnm.rollback()    #错误则回滚
    print("错误")
finally:
    cnm.close()    #数据库连接需要关闭

说明:
执行该sql最后结果为3条,fetchall()、fetchmany()和fetchone()出现位置不同,则结果不同。
fetchmany(size=1) 取出结果集中的第一条。此时游标处于第二行开始位置。
fetchall() 取出结果集中的全部,也就是游标当前位置至结束,此时游标处于结果集末尾。
fetchone() 取出结果集中的下一条,此时游标处于末尾,返回None。
executemany说明
executemany()主要是针对一条sql需要执行多次,每次执行的参数不同情况。数据量较多时建议使用executemany()方法,速度较快。
下面是executemany()简单示例。

import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test')
cus = conn.cursor()
sql = 'insert into test(id, name) values(%s, %s)'
args = [(1, 'Alice'), (2, 'Bob'), (3, 'Cellary')]
try:
    print(cus.executemany(sql, args))    #输出结果:3
except Exception as e:
    print("执行出错:{0}".format(e))
finally:
    cus.close()
    conn.commit()
    conn.close()

数据库连接池

python编程中使用pymysql进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时都是独立的额请求,比较浪费资源,而且访问数量达到一定数量时,对mysql性能会产生较大的影响。因此在实际使用过程中通常会使用数据库的连接池技术来访问数据库,从而实现资源复用。同时也可以保证数据库不会因为连接数过多而造成数据库宕机。
在python中DBUtils是一套数据库连接池包,提供2种接口。

  • PersistentDB :提供线程专用的数据库连接,并自动管理连接。
  • PooledDB :提供线程间可共享的数据库连接,并自动管理连接。
    下面使用PooledDB示例
import pymysql
from DBUtils.PooledDB import PooledDB

from DBUtils.PooledDB import PooledDB
db_config = {
        "host": "127.0.0.1",
        "port": 3306,
        "user": "root",
        "passwd": "123456",
        "db": "test",
        # "charset": "utf8"
    }

spool = PooledDB(pymysql, 5, **db_config)  # 5为连接池里的最少连接数
conn = spool.connection()  # 以后每次需要数据库连接就是用connection()函数获取连接
cur = conn.cursor()
SQL = "select * from test;"
r = cur.execute(SQL)
r = cur.fetchall()
print(r)
cur.close()
conn.close()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值