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权重越小,优先级越高