在写代码的时候经常遇到要操作数据库,进行增删查改。目前比较流行的数据库有很多,有关系型数据库和非关系型数据库,下面描述常见的MySQL、redis和MongoDB数据库的python操作。
- 1.操作MySQL:
- python操作MySQL数据库需要安装第三方模块进行操作,python2中可以直接安装MySQLdb模块,可以直接通过
pip install MySQLdb
进行安装使用。而在python3中没有了MySQLdb模块,可以用pymysql进行替换,通过pip install pymysql
安装。下面介绍在python3中使用pymysql。
- python操作MySQL数据库需要安装第三方模块进行操作,python2中可以直接安装MySQLdb模块,可以直接通过
import pymysql
# 创建连接,指定数据库的ip地址,端口号,账号,密码,数据库,编码格式
conn=pymysql.connect(host='localhost',port=3306,user='root',passwd='root',db='database',charset='utf-8')
# 创建游标
cursor=conn.cursor()
# 执行SQL语句,并返回影响行数
effect_row=cursor.execute("update employees set name='employees1' where sid=0102")
effect_row=cursor.executemany("insert into employees (name,age)values(%s,%s);",[("zhangsan",20),("Lisi",21)])
# 执行查询语句
cursor.execute("select * from employees;")
# 获取第一条数据
data=cursor.fechone()
# 获取多少条数据
datas=cursor.fetchmany(100)
# 获取所有的数据
data=cursor.fetchall()
# 提交所有操作修改
conn.commit()
cursor.close() # 关闭游标
conn,close() #关闭连接
# 获取自增id
lastId=cursor.lastrowid
- 2.一般情况之下,pymysql创建的cursor游标都是返回一个操作结果的元组,如果想要操作的结果返回的是字典格式,可以指定创建的cursor游标格式,其他的操作与上面相类似。
import pymysql
# 创建连接,指定数据库的ip地址,端口号,账号,密码,数据库,编码格式
conn=pymysql.connect(host='localhost',port=3306,user='root',passwd='root',db='database',charset='utf-8')
# 创建游标
cursor=conn.cursor(cursor=pymsql.cursors.DictCursor)
-
- 操作Redis数据库:
- redis是noSQL数据库,基于计算机内存,拥有很快的读写速度,之前做ip代理池时候,利用redis数据库的队列结构很适合做入列与出列的操作。下面是python操作Redis数据库的操作,python操作redis的主要模块是redis
import redis
redis=redis.Redis(host="localhost",port="6379",db=1)
# 设置string类型的值
redis.set("name","value")
# 设置key为name的值,如果name不存在,才会进行设置
redis.setnx("name","value")
# 设置key为name的值以及过期时间,过期之后,key值即将失效
redis.setex("name","value",3)
# 批量设置值
redis.mset(k1="v1",k2="v2")
# 获取值
redis.get("name")
# 批量获取值
redis.mget("name1","name2")
# 删除值
redis.delete("name")
# 批量删除值
redis.delete("name1","name2","name3")
# 操作哈希类型值
redis.hset("hname","name","value")
# 给name为hname设置name和value,当name不存在时,才设置set
redis.hsetnx("hname","name","value")
# 批量设置哈希类型·
redis.hmset("hname",{"name1":"value1","name2":"value2"})
# 获取哈希类型的值
redis,hget("hname","name")
# 获取hname下的所有name和value
redis.hgetall("hname")
# 删除哈希类型的name里面指定的值
redis.hdel("hname","name")
# 获取所有的值
redis.keys()
- 3.Mongodb数据库同样是NoSQL数据库,Mongodb是基于bson格式的数据库,之前写了很多的爬虫案例都是直接使用mongodb数据库进行保存。所以现在记录一下python操作mongdb数据的常用模块pymongo。首先可以通过pip工具进行下载pymongo。
# 连接mongodb数据库
import pymongo
client=pymongo.MongoClient(host="127.0.0.1",port=27017)
# 也可以直接使用以下的方式进行创建client
client=MongoClient("mongodb://localhost:27017")
# 指定要使用的数据库
db=client["dbname"]
db=client.dbname
# 指定使用的集合,类似于mysql数据库的表结构
collection=db.collectionName
collection=db["collectionName"]
# 如果mongodb数据库以授权验证的形式启动,还需要进行数据库验证
db.authenticate(username,password)
# 数据形式
data={
"id":"1010101",
"name":"kiwis"
"age":20
}
# 插入数据,插入数据,会返回一个_id值,如果没有设置这个字段值,则mongodb数据库会自动生成一个object_id的值返回
collection.insert(data)
# 插入多条数据,返回_id的集合
collection.insert([data1,data2])
# python3的官方pymongo推荐使用insert_one和insert_many方法插入一条或多条数据
#insert_one返回的值不再是_id值,而是InsertOneResult对象,可以通过对象获取insert_id值(相当于_id)
collection.insert_one(data)
# insert_many像上面一样可以通过列表的形式进行传递,insert_many方法返回的类型是InsertManyResult对象,通过其inserted_ids属性可以获取插入数据的_id列表
coilection.insert_many([data1,data2])
# 数据查询,find_one与find分别可以查询一条结果与多条结果数据
# find_one返回一条字典类型的数据
collection.find_one({"name":"kiwis"})
# find返回多条数据,返回的结果是Cursor类型,相当于一个generator生成器,如果需要迭代数据,每一个结构都是字典类型的数据
collection.find({})
# 例子迭代数据结果
datas=collection.find({})
for data in datas:
print(data["name"])
# 查询的其他条件,下面是查询name为kiwis,age大于20的数据结果
collection.find({"name":"kiwis","age":{"$gt":20}})
# 其他的筛选条件如下所示
# $ lt小于{"age":{"$lt":20}}
# $gt大于{"age":{"$gt":20}}
# $lte小于等于{"age":{"$lte":20}}
# $gte大于等于{"age":{"$gte":20}}
# $ne不等于{"age":{"$ne":20}}
# $in 在范围之内{"age":{"$in":[10,30]}}
# $nin 不在范围之内{"age":{"$nin"}}
# $regex 正则表达式筛选{"name":{"$regex":"kiwis$"}},表示已kiwis结尾的name值的数据
# $exists判断属性存在与否 {"name":{"$exists":True}}表示查询name属性存在值的数据
# $type属性的类型值 {"name":{"$type":String}} name的类型为string
# $mod表示数字操作 {"age":{"$mod":[4,1]}}表示除4余1的数据项
# $text文本查询{"$text":{"$search":"kiwis"}} text类型数据的属性包含kiwis的字符串
# $where 条件查询{"$where":"studentName==employeesName"}
# 对查询到的数据进行计数
collection.find({"age":{"$lt":20}}).count()
collection.find({}).count()
# 对查询到的书籍进行排序操作
collection.find({}).sort("name",pymongo.ASCENDING)
# 如果想跳过几个数据,进行取值,可以直接使用skip
collection.find({}).skip(1)
# 获取到的数据进行数量的取值限制limit
collection.find({}).skip(1).limit(2)
collection.find({}).sort("age",pymongo.ASCENDING).skip(1).limit(2)
# 对数据进行更新
collection.update({"name":"kiwis"},{"$set":{"age":23,"name":"laternkiwis"}})
collection.update({"name":"kiwis"},{"$set":{"age":23}})
# 如果有多个结果,是否全部修改
collection.update({"name":"kiwis"},{"$set":{"age":23}},multi=True)
# 删除全部数据
collection.remove({})
# 删除指定的数据
collection.remove({"name":"kiwis"})
上面总结都是常见的python操作数据方法,具体参照各个模块的API说明文档