写代码的时候,经常会操作数据库,增删改查。数据库有很多类型,关系型数据库和非关系数据库,这里介绍一下python怎么操作mysql、redis和mongodb。
一、python操作mysql数据库
python3中操作mysql数据需要安装一个第三方模块,pymysql,使用pip install pymysql安装即可。在python2中是MySQLdb模块,在python3中没有MySQLdb模块了,所以使用pymysql。mysql为传统的关系型数据库,关系型数据库有以下特点:
1、数据存在磁盘上
2、使用sql语句来操作数据
3、表与表之间有关系
使用python操作mysql大致有以下几步:
1、连上数据库:ip、账号密码、端口号、数据库
2、建立游标
3、执行sql
4、获取结果
5、关闭游标、关闭连接
import pymysql # 创建连接,指定数据库的ip地址,账号、密码、端口号、要操作的数据库、字符集 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='data', charset='utf8') cur = conn.cursor()# 创建游标 sql = "update students set name = 'niuhy' where id = 1;" effect_row = cur.execute(sql) # 执行SQL,并返回受影响行数 # executemany 批量插入数据 sql = "insert into students (name,age) values (%s,%s);" args = [("andashu", 18), ("12345", 20)] # 包含多个元组的列表,每个元组对应mysql当中的一条数据 cur.executemany(sql,args) #批量插入数据 # effect_row = cur.executemany("insert into students (name,age) values (%s,%s); ", [("andashu", 18), ("12345", 20)]) conn.commit() # 提交,不然无法保存新建或者修改的数据 cur.execute("select * from students;") # 执行select语句 row_1 = cur.fetchone() # 获取查询结果的第一条数据,返回的是一个元组 row_2 = cur.fetchmany(3)# 获取前n行数据 row_3 = cur.fetchall()# 获取所有数据 new_id = cur.lastrowid # 获取最新自增ID cur.close()# 关闭游标 conn.close()# 关闭连接
上面的操作,获取到的返回结果都是元组,如果想获取到的结果是一个字典类型的话,可以使用下面这样的操作:
import pymysql # 创建连接,autocommit=Ture表示自动提交,在新增修改数据时会自动提交 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='data', charset='utf8',autocommit=True) cursor = conn.cursor() # 创建游标 cursor = coon.cursor(cursor=pymysql.cursors.DictCursor) # 需要指定游标的类型,字典类型 cursor.execute("select * from user;")# 执行SQL # 获取返回结果,这个时候返回结果是一个字典 res = cursor.fetchone() # 返回一条数据,如果结果是多条的话 print(res) res2 = cursor.fetchall() # 所有的数据一起返回
二、python操作redis
redis是一个非关系型(nosql)的数据库,数据都存在内存中,有很快的读写速度,python操作redis使用redis模块,pip安装即可:pip install redis
import redis r = redis.Redis(host='127.0.0.1',port=6379,password='123456',db=10) #连接redis #增删改查 #操作string类型 r.set('nhy_info','age 18 sex nan sdfsdfsdfsd') #增加、修改数据,如果设置正确则返回true res = r.get('nhy_info') #获取数据,二进制 print( res.decode() ) #编码,就变成了字符串 r.delete('nhy_info') #指定一个key删除他,key不存在的话会被忽略
#其他的方法 #exists 判断key是否存在,存在返回true,不存在返回false #expiere 命令用于设置 key 的过期时间。key 过期后将不再可用 #ttl 查看键的失效时间还剩多少 #type 用于返回所储存的值的类型 r.flushdb()#可以清空当前数据库里面所有的key print(r.keys('*info')) #获取到所有符合的key print(r.type('session_crm'))#看key的类型 print(r.exists('dashu_name')) #判断这个key是否存在 r.expire('nhy_info',50)#指定key的失效时间,失效时间为600s。时间未失效时能查到key的值,否则为none print(r.ttl('nhy_info'))#用来这个key的失效时间
操作hash类型的key:
#hash 哈希类的key #哈希类型理解为一个字典嵌套字典 # select 10 redis的命令行里面select 8 就是切换数据库 #增删改查 #增加、修改 r.hset('session_crm','liuxinyu','sdfjksdklfjssdf') #增加,修改 r.hset('session_crm','zhouyifan_','ssdfsdfjksdklfjssdf') # r.hset('session_crm','laowang___','ssdfsdfjksdklfjssdf') # #删除 r.hdel('session_crm','liuxinyu') #删除指定的小key r.delete('session_crm') #直接删除大key #查询 print(r.hget('session_crm','zhouyifan_'))#获取指定小key里面的数据 res = r.hgetall('session_crm')#获取到hash类型里面所有的数据
#查询 # print(r.hget('session_crm','zhouyifan_'))#获取指定小key里面的数据 res = r.hgetall('session_crm')#获取到hash类型里面所有的数据 print(res) #处理返回的结果 a = {} for k,v in res.items(): a[k.decode()] = v.decode() print(a) #{ b'k':b'v',b'k2':b'v2'} for k,v in res.items(): res[k.decode()] = res.pop(k).decode() #能节省内存,因为他把原来的key删掉了 print(res)
三、python操作mongodb
redis是一个非关系型(nosql)的数据库,数据都存在磁盘上的,python操作mongodb使用pymongo模块,pip安装即可:pip install pymongo
import pymongo client = pymongo.MongoClient(host='118.24.3.40',port=27017) #连接mongodb db = client['szp']#选择数据库,如果这个数据库不存的话,会帮你创建 # db = client.spz collection = db['stu_info']#选择一个集合,就相当于mysql里面表 # collection = db.stu_info #插入 collection.insert({'name':'Tom','age':18,'sex':'男','hobbies':['吃饭','睡觉','打豆豆']}) #插入数据 lucy = {'name':'Lucy','age':'20','sex':'女','hobbies':['音乐','电影','吉他']} collection.insert(lucy) # #更新 collection.update({'name':'Lucy'},{'$set':{'age':'18'}}) #查询 # 查询所有的结果 for i in collection.find(): print(i) # 查询name为lucy的 for d in collection.find({'name':'Lucy'}): print(d) #删除 collection.delete_one({'name':'Lucy'})#如果有多条的话,只会帮你删掉1条 collection.delete_many({'name':'Tom'})#会删除多条