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
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)
mysql连接
安装pymysql包
pip install pymysql
import pymysql
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)
cur = conn.cursor()
res = "select * from my"
res1 = cur.execute(res)
print(res1)
print(cur.fetchone())
print(cur.fetchmany(res1))
6
(6, 'fff2002')
((6, 'qwe123'), (10, 'afcecw'), (22, 'qwfdew'), (325, 'myuhter'), (325, 'myuhter'))
接着直接写print(cur.fetchall())的话会输出(),因为这时指针到了尾部,前面每读一次,指针就向后一个数据,只输出指针后的,这里不考虑移动游标
conn = pymysql.connect(**db_config)
cur = conn.cursor()
res = "insert into my values(123,'樊吏哲')"
res1 = cur.execute(res)
conn.commit()
cur.close()
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
red = redis.StrictRedis(host='127.0.0.1',db=n,decode_responses = True)
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
red.lpush("mylist",10,20,20)
2
red.rpush("mylist",40,50)
print(red.lrange("mylist",0,-1))
print(red.llen('mylist'))
red.linsert("mylist", "before", 40, "蓝桥")
print(red.lrange("mylist",0,-1))
red.lrem("mylist",1,10)
print(red.lrange("mylist",0,-1))
print(red.lpop("mylist"))
print(red.lindex("mylist",1))
哈希
red.hset('hash_name','name','qiye')
print(red.hget('hash_name','name'))
在python已经被弃用了
set
red.sadd("myset","a","b","c")
red.sadd("yourset","b","c","d")
print(red.smembers('myset'))
print(red.scard('myset'))
print(red.sdiff("myset","yourset")) 得到的是a(set的第一步),看谁在前
print(red.sinter("myset","yourset"))
print(red.sismember("myset","a"))
print(red.sismember("yourset","a"))
red.srem('set_name',"a")
zset
red.zadd("zset_name",{"a":1,"b":2,"c":3,"d":4})
print(red.zrange('zset_name',0,-1))
print(red.zcard('zset_name'))
print(red.zcount('zset_name',3,4))
print(red.zscore('zset_name','b'))
red.zrem('zset_name','a')
print(red.zrange('zset_name',0,-1))
zset权重越小,优先级越高