Skip to content

pymysql + redis

一、mysql补充

1. 自关联查询

python
# 自关联查询 自己关联自己
select *
from first_db.areas p
         join first_db.areas c on p.id = c.pid
         join first_db.areas d on c.id = d.pid;

2. 子查询

python
# 子查询
# 用在from后
select *
from (select *
      from first_db.products
      where price > 1000) as p
where p.stock > 80;
# 用在where后
select *
from first_db.products
where price > (select avg(price) from first_db.products);
# 用在select后
select product_name, price - (select avg(price) from first_db.products) as 与平均价格差
from first_db.products;

二、pymysql

python
# 导入pymysql
import pymysql

# 建立连接
conn = pymysql.connect(
    # ip+端口
    host='192.168.88.161',
    port=3306,
    # 用户名+密码
    user='root',
    password='your-mysql-password',
)
# 创建游标(通过链接对象创建)
cursor = conn.cursor()
# 执行SQL语句(通过游标执行)
res = cursor.execute("""
# sql语句
# 解决sql注入数据问题
# 1.使用%书写sql语句
# 2.用列表传入参数填充%
"select * from second_db.users where username = %s and password = %s ", [username, password]

# 确认
conn.commit()
# 回滚到上一次commit
conn.rollback()
""")
# 查看受影响行数(不是具体行数)
print(res)
# 查看结果
# 单条查询(元组)
# cursor.fetchone()
# 全部结果(二维元组)
# cursor.fetchall()
# 关闭游标
cursor.close()
# 关闭连接对象
conn.close()

三、redis

1. 基本使用

python
# 导入radis
import redis

# 创建连接
r = redis.Redis(
    # ip + 端口(有默认可以不传)
    host='127.0.0.1',
    port=6379,
    # 库 + 密码(空)(有默认,可以不传)
    db=0,
    password=None,
    # 自动解码
    decode_responses=True
)
# 测试链接
try:
    res = r.ping()
    print(f'连接成功{res}')
except Exception as e:
    print(f'连接失败{e}')
# 关闭连接
r.close()

2. API

1. 字符串

python
# 设置单个值
# r.set(键,值)

# 取出值
# r.get(键)

# 设置多个值
# r.mset({键1:值1, 键2:值2, 键3:值3})

# 取出多个值
# r.mget([键1, 键2, 键3])

# 设置值和设置过期时间(过期后数据自动删除)
# r.setex('键',时间(秒), '值')

2. 数值

python
# 自增1
r.incr()
# 自减1
r.decr()
# 自增n
r.incrby('键',数量)
# 自减n
r.decrby('键',数量)

3. 哈希

python
# 给redis的键设置一个字典类型的值 r.hset('redis的键','值得键','值得值')

# 获取字典某个键的值 r.hget('redis的键','值得键')

# 获取redis某个字典的所有键值对 r.hgetall('redis的键')

# redis的键设置多个键值对 r.hmset('redis的键',{键1:值1,键2:值2})

# 获取redis的键的多个键值对 r.hmget('redis的键',[键1,键2])

# 获取redis的键对应字典的所有键 r.hkeys('redis的键')

# 获取redis的键对应字典的所有值 r.hvals('redis的键')

# 删除redis的键对应字典的属性(可以删多个)
# r.hdel('redis的键', '键1', '键2')

4. 列表

python
# 左侧添加元素 r.lpush(键,值)

# 右侧添加元素 r.lpush(键,值)

# 查看列表 r.lrange(键,起始索引,结束索引) 包头包尾

# 左侧弹出元素 r.lpop(键)

# 右侧弹出元素 r.rpop(键)

# 获取列表长度 r.llen(键)

5. 集合

python
# 添加元素 r.sadd('键','值')

# 查看集合元素 r.smembers('键')

# 判断元素是否存在 r.sismember('键','值')   存在返回1,不存在返回0

# 获取集合元素的长度 r.scard('键')

# 随机弹出一个元素 r.spop('键')

# 指定移除一个元素 r.srem('键','值')

# 获取两个集合的交集 r.sinter(['键1','键2'])

# 获取两个集合的并集 r.sunion(['键1','键2'])

# 获取两个集合的差集 r.sdiff(['键1','键2']) (前减后)

6.有序集合

python
# 有序集合 r.zadd('键',{'键':'值'})

# 按照分数升序排列 r.zrange('键',0,-1, withscores=True)

# 按照分数降序排列 r.zrevrange('键',0,-1, withscores=True)

# 获取指定元素的分数 r.zscore(redis的'键','键')

# 增加(减少)指定元素的分数 r.zincrby(redis的'键',增加的分数,'键')

# 获取排名 r.zrank(redis的'键','键') 索引

# 获取范围内的元素 r.zrangebyscore(redis的'键',最小值,最大值,withscores = True)