一 python操作mysql

1.0 mysql前备知识

数据查询语言(DQL):数据库使用最多的一个操作.
数据操纵语言(DML)

不常用:
数据定义语言(DDL)
数据控制语言(DCL)

使用前要开启mysql服务.(在cmd中)
cmd命令:
开启mysql服务: net start mysql
关闭mysql服务: net stop mysql
使用前要安装pymysql库.
pymysql是利用游标来执行SQL语句,创建一个游标,并执行SQL语句.

python操作mysql---菜鸟教程仅作为参考和了解.

1.1 pymysql.connect()的常用参数

host – 数据库服务器所在的主机。
port – 数据库开放的端口。(默认: 3306)
user – 登录用户名。
password – 登录用户密码。
database – 连接的数据库。
charset – 连接字符集。

1.2 connect()的常用方法

begin(): 开启事务
commit():提交事务
cursor(): 创建游标
ping():检查链接是否存活,会重新发起链接
rollback(): 回滚事务
close():关闭链接
select_db():选择数据库
show_warnings(): 查看warnings信

1.3cursor(游标)常用方法

execute():执行单条语句
executemany():执行多条语句
fetchone():获取第一行
fetchmany(size):获取下几(size)行
fetchall():获取剩下所有的行
scroll(num,mode):移动游标
rowcount:计算corsor的行数
description:返回字段信息
close():关闭游标

1.4 实例

1.4.1 实例一(自己写的)

import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='day061',
                       charset='utf8')  # 连接上数据库
cur = conn.cursor()  # 建立一个游标
cur.execute('select * from app1_author')  # 通过游标执行mysql数据,由于游标会记住当前的位置,所以生成的cur可以看做是一个生成器(打完即止)

# fetch查询数据
a =cur.fetchone()
print(a) # 拿到第一条数据,以元组形式展示出拿到的数据(下面的都是这样)
b = cur.fetchmany(2)
print(b) # 拿到接下来的两条数据,如果只剩下1条就拿1条
c = cur.fetchall()
print(c) # 拿到所有的数据,没有的话返回一个空元组

# scroll移动游标
# cur.scroll(3, mode='absolute')  # 绝对位置移动,以0作为起点,移动游标,第一次参数只能是大于或等于0,返回数据为空,仅用于移动游标,超出范围会报错
# cur.scroll(-1,mode='relative') # 相对位置移动 ,以游标目前的位置作为起点,然后根据第一参数进行移动。负数向左移,正数向右移,返回数据为空,仅用于移动游标,超出范围会报错

cur.close()  # 关闭游标
conn.close()  # 关闭数据库

1.4.2 实例二(摘来的)

知识补充:
在Python中对数据库进行增删改使用的是事务处理,和DQL不一样,这点需要注意,在执行增删改SQL语句后,需要提交事务才能在数据库中完成操作,并且还需添加错误判断,当执行SQL失败后,需要对事务进行回滚。

事务用来管理 insert,update,delete 语句
事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Author  : Muzi_Li
File    : 06-2 新增数据.py
Time    : 2018-12-24 13:02
Software: PyCharm
'''
import pymysql

conn = pymysql.connect(host='192.168.1.115',  # ID地址
                       port=3308,  # 端口号
                       user='root',  # 用户名
                       passwd='123456',  # 密码
                       db='任务协作',  # 库名
                       charset='utf8')  # 链接字符集
cur = conn.cursor()  # 创建游标
sql_insert = 'insert into 员工资料 values(6,"董事长","十一郎",123)'  # 新增SQL语句
sql_update = "update 员工资料 set 密码 = 111 WHERE ID = 6"  # 修改SQL语句
sql_delete = "delete from 员工资料 where ID = 6"  # 删除SQL语句
try:
    cur.execute(sql_insert)  # 执行新增SQL语句
    cur.execute(sql_update)  # 执行修改SQL语句
    cur.execute(sql_delete)  # 执行删除SQL语句
    conn.commit()  # 提交事务(只有提交之后上面SQL语句才会生效)
except Exception as e:
    conn.rollback()  # 如果发生错误,则回滚事务
finally:
    cur.close()  # 关闭游标
    conn.close()  # 关闭数据库

转自木子李

1.5 其他补充

数据库连接池:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
百度在用的Python MySQL连接池---PyMysqlPool(里面有连接池使用范例)
PyMysqlPool在线文档

MySQLdb库和pymysql库的区别:

MySQLdb只支持Python2,还不支持3.
可以用PyMySQL代替。安装方法:pip install PyMySQL然后在需要的项目中,把 __ init__.py中添加两行:import pymysqlpymysql.install_as_MySQLdb()就可以用 import MySQLdb了。其他的方法与MySQLdb一样。(这尼玛不是挂羊头卖狗肉吗?哈哈)

二 python操作MongoDB

2.0 MongoDB前备知识

执行pip install pymongodb

2.1 python操作MongoDB

from pymongo import MongoClient

client = MongoClient('127.0.0.1', 27017)  # 填写数据是连接上指定的主机和端口,不填的话连上默认的主机
MDB = client['first']  # 连接上名为first的数据库,注意,这里可以用[]拿,也可以用 .helloToy的形式拿,(据说集合的写法和数据库一样,但是不会用)
# print(client.helloToy)

data = {
    'username': 'smith',
    'password': '123',
    'hobby': []
}
# 此时添加一个login表到first数据库里面(MongoDB不需要主动创建,你用了就是创建,没用就是没创建)

# 增加(其中data是添加进去的数据类型)
# 增加一条
MDB.login.insert_one(data)
# 增加多条(注意,多条的时候不要指向同一个内存地址,否则会报错)
from copy import deepcopy
data2 = deepcopy(data)
MDB.login.insert_many([data,data2])
# 增加时直接获取id值
data_id = MDB.login.insert_one(data).inserted_id
print(data_id,type(data_id))
# 结果:5d3afe4dd2c1af4bd6352126 <class 'bson.objectid.ObjectId'>
# 没想到可以直接打印出id,虽然是ObjectId类型,但是可以转化得到的.(该类型不能用于json序列化)
# 关于时间的插入
import datetime
# 正常写在data里面即可,如{'data':datetime.datetime.now()},这时候mongodb自动转成了 ISOdate类型.
# 若想要字符串类型的话,换成datetime.datetime.now().isoformat()即可.

# 查询
# 查询一条
get_data = MDB.login.insert_one({'username': 'smith'})
# 查询多条
get_data = MDB.login.insert_many({'username': 'smith'})

# 修改
# update_one(filter,update,upsert=False,bypass_document_validation=False,collation=None,array_filters=None,session=None)
# 第一个参数 filter:更新的条件
# 第二个参数 update : 更新的内容,必须用$操作符
# 第三个参数 upsert : 默认False。若为True,更新条件没找到,则插入更新的内容
# 也就是说,update其实可以当做insert用咯?
# 实例:mongo_collection.update_many(update_condition, {'$set' : info}, upsert= True)
# 更新一条
MDB.login.update_one({'username': 'smith'}, {'$set': {'username': 'path'}})
# 一次更新多条
MDB.login.update_many({'username': 'smith'}, {'$set': {'username': 'path'}})
# set是更新字段信息,

# 删除
# 删除一条
MDB.login.delete_one({'username' : 'smith'})
# 删除多条(慎用)
MDB.login.delete_many({'username' : 'smith'})

# $数学比较符(可直接用于python)
# 	$lt 	小于
# 	$lte	小于等于
# 	$gt		大于
# 	$gte	大于等于
# 	$eq :	等于
# 	$ne		不等于
#
# $修改器 + $ 字符特殊用法(可直接用于python)
# 	针对单个字段的操作:
# 	$set 修改某个字段的值 db.stu.update({age:20},{$set:{name:"绿绿",gender:1}})
# 	$unset	删除字段 db.stu.update({name:"小黑"},{ $unset: { newField:1 } })
# 	$inc 引用增加 先引用 后增加 db.stu.update({},{$inc:{age:-1}})
# 	针对 Array == list 操作
# 	$push == append()
    # $pushAll == extend()
    # $pull == remove()
    # $pullAll
    # $pop (=) pop()
        # 举例:
        # MDB.login.update({'username':"smith"},{ $push: { hoobys:"渣男" } })
        # MDB.login.update({'username':"smith"},{ $pushAll: {"hoobys":[1,2,3,5] })

# 查询关键字(可直接用于python)
# 并列查询        $ and
# db.tablename.find({name: "345", age: 1})
# db.stu.find({$ and: [{name: "绿绿"}, {age: 20}]})
# 或条件查询        $ or
# db.stu.find({$ or:[{name: "绿绿"}, {name: "小黑"}]})
# 子集查询        $all
# db.stu.find({"user_list": {$all: ["dashabi", "alex"]}})
# 范围查询        $ in
# ["绿绿", "黑黑", "红红", "小黑"]
# db.stu.find({name: {$ in:["绿绿", "黑黑", "小红", "小黑"]}})

# 排序 + 选取 + 跳过
    # 排序:sort
    # db.stu.find().sort({ age:1 }) 1正序 -1倒序
    # 选取:limit
    # db.stu.find().limit(2) 选取两条数据
    # 跳过:skip
    # db.stu.find().skip(2) 跳过前两条数据
    # 选择中间两条 or 跳过前N条
    # db.stu.find().skip(0).limit(2).sort({ age:-1 })
    # 先排序 - 跳过 - 选取
    # var page = 1
    # var num = 2
    # var sk = (page-1) * num
    # db.stu.find().skip(sk).limit(num).sort({ age:-1 })

三 python操作Redis

3.0 Redis前备知识

安装:pip install redis

Redis是一个开源的基于内存也可持久化的Key-Value数据库,采用ANSI C语言编写。它拥有丰富的数据结构,拥有事务功能,保证命令的原子性。由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。但内存数据库通常要考虑机器的内存大小。
Redis有16个逻辑数据库(db0-db15),每个逻辑数据库项目是隔离的,默认使用db0数据库。若选择第2个数据库,通过命令 select 2 ,python中连接时可以指定数据库。

常用数据结构:
String-字符串
List-列表
Hash-哈希
Set-集合
ZSet-有序集合
Bitmap-位图

python---redis使用
Python操作redis
Python中使用Redis详解
python与redis的初次碰撞——把玩redis数据库的一点心得

3.1 python操作Redis

注意,最重要的只有两个,一个是set,一个是get.

r.set('name', 'zhangsan') #在Redis中设置值,默认不存在则创建,存在则修改
print(r.get('name'))    # 查询key为name的值
r.delete("gender")  # 删除key为gender的键值对
print(r.keys()) # 查询所有的Key
print(r.dbsize())   # 当前redis包含多少条数据
r.save()    # 执行"检查点"操作,将数据写回磁盘。保存时阻塞
# r.flushdb()        # 清空r中的所有数据

set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认,不存在则创建,存在则修改

参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行
xx,如果设置为True,则只有name存在时,当前set操作才执行

setnx(name, value) 设置值,只有name不存在时,执行设置操作(添加)

setex(name, time, value)
设置值 参数:time,过期时间(数字秒 或 timedelta对象)
psetex(name, time_ms, value)
设置值参数:time_ms,过期时间(数字毫秒 或 timedelta对象)
mset(*args, **kwargs)
批量设置值
mget(keys, *args)
批量获取
getset(name, value)
设置新值并获取原来的值

3.2 实例


# 普通连接
import redis   # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

r = redis.Redis(host='localhost', port=6379, decode_responses=True)   # host是redis主机,需要redis服务端和客户端都启动 redis默认端口是6379
r.set('name', 'junxi')  # key是"foo" value是"bar" 将键值对存入redis缓存
print(r['name'])
print(r.get('name'))  # 取出键name对应的值
print(type(r.get('name')))


# 连接池
# redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。
# 可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池
import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)  # type: redis # host是redis主机,需要redis服务端和客户端都启动.
RDB = redis.Redis(connection_pool=pool)
RDB.set('gender','male')  # key是"gender" value是"male"  将键值对存入redis缓存
print(RDB.get('gender'))  # gender取出键male对应的值
posted on 2019-07-28 14:21  流云封心  阅读(209)  评论(0)    收藏  举报