Python学习Python操作数据库

写代码的时候,经常会操作数据库,增删改查。数据库有很多类型,关系型数据库和非关系数据库,这里介绍一下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

 redis是一个key-value存储系统

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'})#会删除多条

原文地址:https://www.cnblogs.com/ddxxn/p/9636517.html