likes
comments
collection
share

mysql事务,mysql、redis与pycharm的连接

作者站长头像
站长
· 阅读数 11

mysql事务

关系型数据库的特性(原子:事务要么一次性都成功了,要么全部都不完成,
                 一致:保持数据的完整,事务开始前后数据库的完整性不变
                 隔离:争夺资源,到底听谁的
                 持久:一些修改好的数据,会永久存在,即使系统故障,也不会动)

隔离性的等级(往下越来越高)
    未提交读(Read uncommitted):一个事务还没提交,另一方就能查看--脏读,就是读到的数据不 
                               准确
    读提交读(read committed):MySQL的默认等级,必须要等一个事务完全提交才能查看--幻读
    可重复读(repeatable  read):已开启的事务不允许增删改,可以查,不能使用update,但是 
                               可以insert
    序列化(Serializable):排队执行,只有前面的完成了才能执行后面的,但效率低

    
# 开启事务,首先要有一个表格
begin;#选择库,然后开启,然后开始下面的操作
         
mysql> begin;     #开启后添加一些数据
Query OK, 0 rows affected (0.00 sec)

mysql> insert into my values(6,'fff2002');
Query OK, 1 row affected (0.00 sec)

mysql> insert into my values(6,'qwe123');
Query OK, 1 row affected (0.00 sec)

mysql> insert into my values(10,'afcecw');
Query OK, 1 row affected (0.00 sec)

mysql> insert into my values(22,'qwfdew');
Query OK, 1 row affected (0.00 sec)

mysql> insert into my values(325,'myuhter');
Query OK, 1 row affected (0.00 sec)

#添加后再新建一个终端去到刚刚的库和表格去查,发现查不到,表格为空-----未提交读
mysql> use my;
ERROR 1049 (42000): Unknown database 'my'
mysql> use mydb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from my;
Empty set (0.00 sec)

# 提交,这时我们要输入commit回车提交
    commit
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
#再去刚刚新建的终端查看,发现有数据了
mysql> select * from my;
+------+---------+
| id   | name    |
+------+---------+
|    6 | fff2002 |
|    6 | qwe123  |
|   10 | afcecw  |
|   22 | qwfdew  |
|  325 | myuhter |
+------+---------+
5 rows in set (0.00 sec)

# 回滚
   rollback
如果insert后发现数据不想要了,就rollback结束

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into my values(001,'igbdge');
Query OK, 1 row affected (0.00 sec)

mysql> insert into my values(001,'igbdge');
Query OK, 1 row affected (0.00 sec)

mysql> insert into my values(001,'igbdge');
Query OK, 1 row affected (0.00 sec)

mysql> insert into my values(001,'igbdge');
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
         #rollback后,此次事务就结束了,但是此次开启的事务所有的操作均不会提交,rollback 
          #是此次事务所有的操作全部无效,删除的话只能一条一条的删
    

mysql连接

安装pymysql包
	pip install pymysql
#连接到MySQL
    import pymysql

    # dbcomfig(ip 端口 用户名 密码 数据库 数据表 )
    db_config = {
        'host':'127.0.0.1',
        'port':3306,
        'user':'root',
        'password':'qwe123',
        'db':'python3',
        'charset':'utf8',
    }
    conn = pymysql.connect(**db_config)  # 获取链接对象
    cur = conn.cursor()     # 游标对象
    print(cur) # 多少条数据
#然后写语句
###查
    conn = pymysql.connect(**db_config)  # 获取链接对象  **db_config不定长参数
    cur = conn.cursor()     # 游标对象(指针)

    res = "select * from my"
    res1 = cur.execute(res)     #####必须要有execute
    print(res1)     #输出个数
    print(cur.fetchone())     #输出第一条
    print(cur.fetchmany(res1))    #输出全部,res1也可以换成数字,是几就从第一条输出到 
                                  #数字条,也就是可指定条数
    6
    (6, 'fff2002')
    ((6, 'qwe123'), (10, 'afcecw'), (22, 'qwfdew'), (325, 'myuhter'), (325,       'myuhter'))
#以元组形式展示

接着直接写print(cur.fetchall())的话会输出(),因为这时指针到了尾部,前面每读一次,指针就向后一个数据,只输出指针后的,这里不考虑移动游标

##execute是使用游标执行sql语句

###增
    conn = pymysql.connect(**db_config)  # 获取链接对象  **db_config不定长参数
    cur = conn.cursor()     # 游标对象(指针)

    res = "insert into my values(123,'樊吏哲')"
    res1 = cur.execute(res)

    conn.commit()
    cur.close()   #先打开conn后打开cur,所以先关闭cur,再关闭conn,一定要有关闭这一步骤
    conn.close()
终端里:
mysql> select * from my;
+------+-----------+
| id   | name      |
+------+-----------+
|    6 | fff2002   |
|    6 | qwe123    |
|   10 | afcecw    |
|   22 | qwfdew    |
|  325 | myuhter   |
|  325 | myuhter   |
|  123 | 樊吏哲    |
+------+-----------+
7 rows in set (0.00 sec)


redis连接

安装redis包
	pip install redis

# decode_responses = True:中文格式化的输出,让redis返回的数据是str类型,如果不指定则结果为bytes. ‘中文’(字节类型的中文)
red = redis.StrictRedis(host='127.0.0.1',db=n,decode_responses = True)#也可以不写db=n,则默认是0号库(共16个库)
print(type(red.keys()))
print(red.keys())

string

# 添加
red.set('name','小柒叶')

# 追加
red.append('name',' lee')

# 查看类型
print(red.type('name'))

# 删除
red.delete('name')

# 查看数据
print(red.get('name'))

# 判断是否存在
print(red.exists('name')) 

red.mset({'abc':123,'bcd':234})
print(red.mget('abc','bcd'))


red.rename('name','new_ex_name')  # 改键名
print(red.keys())

设置过期时间

red.set('name', 'qiye', ex=10)
print(red.get("name"))

list

# 使用lpush从头部插入元素
red.lpush("mylist",10,20,20)
2

#使用rpush从尾部插入元素
red.rpush("mylist",40,50)
print(red.lrange("mylist",0,-1))

# 使用llen获取列表元素的个数
print(red.llen('mylist'))

# 使用linsert在列表的某个值的前后插入一个值
red.linsert("mylist", "before", 40, "蓝桥")
print(red.lrange("mylist",0,-1))
# 第一个参数为key,第二个参数为before/after,第三个参数是在某个元素值的前或者后,第四个参数是需要插入的值

# 使用lrem删除list的指定值
red.lrem("mylist",1,10)   #第二个参数为个数,删除几个10
print(red.lrange("mylist",0,-1))

# 使用lpop移除列表最左侧的元素,并返回
print(red.lpop("mylist"))

# 使用lindex查询指定索引的的元素,并返回
print(red.lindex("mylist",1))

哈希


red.hset('hash_name','name','qiye')  # 键 域 值
print(red.hget('hash_name','name'))  # qiye

在python已经被弃用了
# red.hmset('hash_name',{'name1':'baye','name2':'jiuye'}) 
# print(red.hmget('hash_name','name','name1','name2'))
# print(red.hgetall('hash_name'))

set


# 使用sadd进行添加元素到集合中
red.sadd("myset","a","b","c")
red.sadd("yourset","b","c","d")

# 使用smembers进行查询集合中的元素
print(red.smembers('myset'))


# 使用scard进行计算集合中的元素个数
print(red.scard('myset'))

# 使用sdiff进行计算两个集合之间的差集
# myset-yourset
print(red.sdiff("myset","yourset"))   得到的是a(set的第一步),看谁在前

# 使用sinter进行计算两个集合之间的交集
print(red.sinter("myset","yourset"))

# 使用sismember检查当前元素是否存在集合之中
print(red.sismember("myset","a"))
print(red.sismember("yourset","a"))

# 使用srem移除指定元素
red.srem('set_name',"a")  

# spop

zset

#使用zadd进行添加元素到有序集合中,传进去一个字典
red.zadd("zset_name",{"a":1,"b":2,"c":3,"d":4})

# 使用zrange返回有序集合范围内的元素
print(red.zrange('zset_name',0,-1))

# 使用zcard进行计算有序集合中的元素个数
print(red.zcard('zset_name'))

# 使用zcount返回有序集合中min--max权重之间的个数
print(red.zcount('zset_name',3,4))

# 使用zscore返回对应权重的元素
print(red.zscore('zset_name','b'))

# 使用zrem删除有序集合的指定元素
red.zrem('zset_name','a')
print(red.zrange('zset_name',0,-1))

zset权重越小,优先级越高
转载自:https://juejin.cn/post/7075303932657926157
评论
请登录