一、python操作mysql数据库:
数据库信息:(例如211.149.218.16 szz 123456)
操作mysql用pymysql模块
#操作其他数据库,就安装相应的模块
import pymysql
ip=’211.149.218.16’
port=3306
passwd=’123456’
user=’root’
db=’szz’
conn=pymysql.connect(host=ip,user=user,port=port,passwd=passwd,db=db,charset=’utf8’) #创建一个数据库连接
cur = conn.cursor(cursor=pymysql.cursors.DictCursor) #在连接上创建一个游标,通过游标去操作数据库;括号里指定游标的类型为字典(指定为字典,方便取值),不指定默认为元组
sql=’insert into nhy(id,name,sex) VALUE (1,’hn’,’nv’);’ #写sql语句
sql2=’select * from nhy;’
cur.execute(sql) #执行sql语句
cur.execute(sql2)
row_1 = cur.fetchone() #获取查询结果的第一条数据,返回的是一个元组,每执行一次就获取一行
row_2 = cur.fetchmany(3) # 获取前n行数据,此时游标在n条数据后面
row_3 = cur.fetchall() # 获取所有数据,此时游标在最后面
PS:(
fetchall和fetchone的区别:
如果select本身取的时候有多条数据时:
cursor.fetchone():将只取最上面的第一条结果,返回单个元组如(‘id‘ ,‘title‘), 然后多次使用cursor.fetchone(),依次取得下一条结果,直到为空。
cursor.fetchall() :将返回所有结果,返回二维元组,如((‘id‘,‘title‘),(‘id‘,‘title‘)),
如果select本身取的时候只有一条数据时:
cursor.fetchone():将只返回一条结果,返回单个元组如(‘id‘,‘title‘)。
cursor.fetchall() :也将返回所有结果,返回二维元组,如((‘id‘,‘title‘),),
)
cur.scroll(n,mode=’absolute’) #移动游标,mode=absolute或relative, absolute指把游标移到数据的第n行,relative的意思是把游标移动到当前游标所在行+n行的位置
cur.scroll(0,mode=’absolute’) #把游标移动到最前面,不管游标在哪
conn.commit() #ddl(insert delete update)dcl dml语句必须提交才生效,不然无法保存新建或者修改的数据
cur.close() #关闭游标
conn.close() #关闭数据库连接
======eg:写操作mysql的函数:
import pymysql
def OperationDb(host,user,passwd,port,db,sql,charset=‘utf8‘): #传参
pymysql.connect(host=host,user=user,passwd=passwd ,port=port,db=db,charset=charset) #建立连接
cur = conn.cursor(cursor=pymysql.cursors.DictCursor) #建立游标
cur.execute(sql) #执行sql语句
if sql.startswith(‘select‘): #判断字符串是不是以什么开头
res=cur.fetchall() #判断如果是select语句,直接返回出执行结果,不用commit了
else:
conn.commit() #如果是insert delete update等语句,则需要提交
res=00 #如果不是select语句,返回00
cur.close()
conn.close()
return res
ss=OperationDb(
host=‘211.149.147.233‘,user=‘byz‘,passwd=‘123456‘,db=‘byz‘,sql=‘insert into hn(id,name,sex) VALUE(08,"houning","female") ;‘
) #外面用单引号,sql语句里面要用双引号;#调用这个函数,并传参,把这个函数的值赋给ss
print(ss) #打印出ss,即函数体里的res
操作redis:
redis是一个nosql类型的数据库(安装Redis Desktop Manager ),里面存的是键值对,键值对数据都存在内存中,有很快的读写速度;python操作redis需要使用redis模块,pip安装即可。
#======下面是操作字符串类型的,key都是string类型
import redis
r = redis.Redis(host=‘127.0.0.1‘,port=6379,db=0,password=’123456’) #指定连接redis的ip、端口号以及哪个数据库、密码
r.set(‘name‘, ‘houning‘) #设置key和value;name是字段,houning是值;如果name的值已存在,这样写就会把原来的值替换掉;
r.setnx(‘name2‘, ‘value‘) #设置的name的值,如果name不存在的时候才会设置
r.setex(‘name3‘, ‘value‘, 30) #设置的name的值,和失效时间,过了30秒后,name3这个key就会自动失效(因为数据都是存在内存当中的,要释放);比如登录一个网页,10分钟后,就需要重新登录,这里就用到了redis的失效时间
r.mset(k1=‘v1‘,k2=‘v2‘) #批量设置多个值,不能设置失效时间
n=r.get(‘name‘) #获取name的值,redis里面获取到的都是bytes类型;
print(n.decode()) # redis里存进去的都是字符串,但获取出来的是bytes类型;decode方法是把bytes类型的结果转换成string类型的
print(json.loads(n.decode())) #把字符串类型再转换成字典或list类型的
print(r.mget(‘k1‘,‘k2‘)) #批量获取key
r.delete(‘name‘) #删除值
r.delete(‘k1‘,‘k2‘) #批量删除
print(r.keys()) #获取所有的key
#======下面是操作哈希类型的key
import redis
r = redis.Redis(host=‘127.0.0.1‘,port=6379,db=0,password=’123456’) #指定连接redis的ip、端口号以及哪个数据库、密码
r.hset(‘hname‘, ‘hn‘, ‘123456‘) #设置哈希类型hname的值,hname是外面的key,hn是里面的key,123456是里面key的值
r.hset(‘hname‘, ‘zg‘, ‘456789‘) #继续给hname设置哈希类型的值
r.hsetnx(‘hname‘,‘key2‘,‘value23‘) #为hname设置里面的key和value,hname这个key不存在的时候才会设置
r.hmset(‘hname‘,{‘k1‘:‘v1‘,‘k2‘:‘v2‘}) #批量设置哈希类型hname的key和value
r.hget(‘hname‘, ‘hn‘) #获取hname里hn的值,取出来是123456
print(r.hgetall(‘hname‘)) #获取hname里面所有的key和value,是一个字典
r.hdel(‘hname‘,‘hn‘) #删除哈希类型hname里,指定的hn值
print(r.keys()) #获取所有的key
PS:
r.set(‘user:houning‘,‘123456‘) #设置key时,如果带冒号,则会在redis上自动建一个user的文件夹,文件夹里存的key和value值为:user_houning,123456
r.hset(‘session:test‘,‘houning‘,‘123456‘) #哈希类型的同上,会自动创建一个session的文件夹,外面的值为“test”,里面的key和value是:houning,123456
====== eg:写操作redis的函数
def OperationRedis(host,passwd,k,v=False,port=6379,db=0): #因为set值时,key和value都得填,所以把v设置成默认值参数
r=redis.Redis(host=host,password=passwd,port=port,db=db)
if v: #如果传了v的值,则设置key和value
r.set(k,v)
res=88
else: #没有传v的值
res=r.get(k).encode() #转换成字符串类型
return res