Python语言系列-10-数据库





MySQL

基础环境准备

readme.txt

作者:Alnk(李成果)
版本:v1.0


安装mysql数据库
	略
	

创建student库
# mysql> create database student charset=utf8mb4;


导入 student.sql 文件到数据库
# mysql> use student;
# mysql> source /root/student.sql


数据库表
# mysql> use student;
# mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| achievement       |
| course            |
| lecturer          |
| student           |
+-------------------+


student.sql

-- MySQL dump 10.13  Distrib 5.1.69, for Win64 (unknown)
--
-- Host: localhost    Database: school
-- ------------------------------------------------------
-- Server version	5.5.48

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `achievement`
--

DROP TABLE IF EXISTS `achievement`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `achievement` (
  `aid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '成绩编号',
  `sid` smallint(5) unsigned NOT NULL COMMENT '学生编号',
  `cid` smallint(5) unsigned NOT NULL COMMENT '课程编号',
  `achievement` decimal(4,1) DEFAULT NULL COMMENT '成绩',
  `addtime` int(10) unsigned DEFAULT NULL COMMENT '考试时间',
  PRIMARY KEY (`aid`)
) ENGINE=InnoDB AUTO_INCREMENT=279 DEFAULT CHARSET=utf8 COMMENT='成绩表';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `achievement`
--

LOCK TABLES `achievement` WRITE;
/*!40000 ALTER TABLE `achievement` DISABLE KEYS */;
INSERT INTO `achievement` VALUES (1,1,4,'70.0',NULL),(2,1,1,'63.0',NULL),(3,1,8,'70.0',NULL),(4,2,4,'63.5',NULL),(5,2,16,'72.0',NULL),(6,2,19,'40.5',NULL),(7,3,11,'78.0',NULL),(8,3,8,'70.0',NULL),(9,3,4,'63.5',NULL),(10,4,4,'84.5',NULL),(11,4,14,'60.0',NULL),(12,4,19,'40.5',NULL),(13,5,10,'50.0',NULL),(14,5,18,'70.0',NULL),(15,5,4,'93.0',NULL),(16,6,19,'70.0',NULL),(17,6,4,'75.0',NULL),(18,6,110,'55.5',NULL),(19,6,19,'75.0',NULL),(20,7,8,'62.5',NULL),(21,7,25,'80.5',NULL),(22,8,14,'60.0',NULL),(23,8,4,'87.0',NULL),(24,9,20,'70.0',NULL),(25,9,22,'88.0',NULL),(26,9,4,'70.0',NULL),(27,10,6,'86.5',NULL),(28,10,4,'85.5',NULL),(29,11,4,'100.0',NULL),(30,11,14,'57.0',NULL),(31,12,4,'70.0',NULL),(32,12,23,'40.0',NULL),(33,13,4,'63.0',NULL),(34,13,15,'63.0',NULL),(35,13,10,'85.0',NULL),(36,14,4,'99.0',NULL),(37,14,5,'60.0',NULL),(38,15,4,'91.0',NULL),(39,15,6,'72.5',NULL),(40,15,16,'90.0',NULL),(41,16,21,'62.0',NULL),(42,16,29,'82.0',NULL),(43,16,4,'84.0',NULL),(44,17,6,'74.5',NULL),(45,17,10,'74.0',NULL),(46,17,15,'88.0',NULL),(47,18,1,'85.0',NULL),(48,18,11,'70.0',NULL),(49,18,4,'84.0',NULL),(50,19,11,'83.0',NULL),(51,19,4,'76.0',NULL),(52,19,1,'82.0',NULL),(53,20,7,'55.0',NULL),(54,20,26,'80.5',NULL),(55,20,4,'64.5',NULL),(56,20,27,'55.0',NULL),(57,21,11,'77.0',NULL),(58,22,4,'84.0',NULL),(59,23,15,'77.5',NULL),(60,23,21,'85.0',NULL),(61,24,4,'98.5',NULL),(62,24,16,'77.0',NULL),(63,25,1,'63.5',NULL),(64,25,4,'95.0',NULL),(65,26,15,'100.0',NULL),(66,26,19,'79.0',NULL),(67,26,27,'78.5',NULL),(68,27,6,'73.0',NULL),(69,27,4,'98.5',NULL),(70,28,4,'85.0',NULL),(71,28,17,'55.5',NULL),(72,29,29,'70.0',NULL),(73,29,4,'86.0',NULL),(74,30,19,'63.5',NULL),(75,30,4,'70.0',NULL),(76,31,4,'90.0',NULL),(77,32,4,'63.5',NULL),(78,32,22,'98.5',NULL),(79,32,15,'65.0',NULL),(80,33,4,'88.0',NULL),(81,34,4,'65.0',NULL),(82,34,7,'95.0',NULL),(83,34,16,'77.0',NULL),(84,35,17,'73.0',NULL),(85,35,7,'65.0',NULL),(86,35,21,'86.0',NULL),(87,35,5,'60.0',NULL),(88,36,8,'88.0',NULL),(89,36,18,'71.5',NULL),(90,36,29,'55.0',NULL),(91,37,1,'86.0',NULL),(92,37,3,'98.5',NULL),(93,38,25,'70.0',NULL),(94,38,4,'81.0',NULL),(95,39,4,'86.0',NULL),(96,39,3,'71.5',NULL),(97,39,13,'65.0',NULL),(98,39,17,'81.0',NULL),(99,40,18,'70.0',NULL),(100,40,22,'55.0',NULL),(101,40,28,'71.5',NULL),(102,41,23,'55.0',NULL),(103,41,19,'95.0',NULL),(104,41,12,'92.0',NULL),(105,42,4,'68.0',NULL),(106,42,11,'70.0',NULL),(107,42,21,'83.0',NULL),(108,43,4,'73.0',NULL),(109,43,16,'98.5',NULL),(110,43,13,'74.0',NULL),(111,44,24,'90.0',NULL),(112,44,6,'70.0',NULL),(113,45,2,'58.0',NULL),(114,45,3,'80.5',NULL),(115,45,26,'95.0',NULL),(116,46,4,'80.5',NULL),(117,46,14,'55.0',NULL),(118,46,10,'70.0',NULL),(119,47,9,'59.0',NULL),(120,47,4,'73.0',NULL),(121,47,23,'79.0',NULL),(122,48,23,'83.0',NULL),(123,48,12,'73.5',NULL),(124,49,9,'73.0',NULL),(125,49,23,'0.0',NULL),(126,49,22,'55.0',NULL),(127,50,4,'59.0',NULL),(128,50,15,'92.0',NULL),(129,51,3,'92.5',NULL),(130,51,29,'72.0',NULL),(131,51,27,'81.0',NULL),(132,52,4,'83.0',NULL),(133,52,10,'78.0',NULL),(134,53,1,'70.0',NULL),(135,53,15,'70.0',NULL),(136,53,21,'64.0',NULL),(137,54,24,'98.0',NULL),(138,54,4,'79.0',NULL),(139,54,5,'62.5',NULL),(140,55,6,'84.0',NULL),(141,55,7,'64.0',NULL),(142,55,9,'80.0',NULL),(143,56,12,'59.0',NULL),(144,56,28,'92.5',NULL),(145,57,18,'78.0',NULL),(146,57,3,'82.5',NULL),(147,57,28,'70.0',NULL),(148,58,13,'48.0',NULL),(149,58,4,'90.0',NULL),(150,58,2,'70.0',NULL),(151,57,8,'70.0',NULL),(152,57,7,'60.0',NULL),(153,57,2,'86.0',NULL),(154,58,4,'64.5',NULL),(155,58,25,'96.0',NULL),(156,58,13,'79.0',NULL),(157,59,1,'92.5',NULL),(158,59,11,'64.0',NULL),(159,60,18,'0.0',NULL),(160,60,28,'78.0',NULL),(161,60,8,'78.0',NULL),(162,61,28,'59.0',NULL),(163,61,8,'86.0',NULL),(164,61,5,'60.0',NULL),(165,62,4,'90.0',NULL),(166,62,3,'79.0',NULL),(167,62,1,'55.5',NULL),(168,63,19,'81.0',NULL),(169,63,4,'62.5',NULL),(170,64,16,'62.5',NULL),(171,64,9,'86.0',NULL),(172,65,11,'81.0',NULL),(173,65,21,'59.0',NULL),(174,65,6,'80.5',NULL),(175,66,8,NULL,NULL),(176,66,18,'67.0',NULL),(177,66,1,'90.0',NULL),(178,67,4,'81.0',NULL),(179,67,18,'62.5',NULL),(180,68,3,'0.0',NULL),(181,68,13,'79.0',NULL),(182,69,4,'60.0',NULL),(183,70,28,'80.5',NULL),(184,70,9,'84.0',NULL),(185,69,26,'79.0',NULL),(186,71,25,'39.0',NULL),(187,71,11,'88.0',NULL),(188,71,10,'77.0',NULL),(189,72,4,'82.5',NULL),(190,72,13,'90.0',NULL),(191,72,23,'71.0',NULL),(192,73,4,'67.0',NULL),(193,73,5,'80.5',NULL),(194,73,7,'70.0',NULL),(195,74,23,'81.0',NULL),(196,74,4,'90.0',NULL),(197,74,25,'39.0',NULL),(198,75,6,'69.0',NULL),(199,75,2,'79.0',NULL),(200,75,16,'90.0',NULL),(201,76,16,'84.0',NULL),(202,76,13,'52.0',NULL),(203,76,3,'0.0',NULL),(204,77,2,'84.0',NULL),(205,77,14,'80.5',NULL),(206,77,28,'90.0',NULL),(207,78,25,'82.5',NULL),(208,78,4,'68.0',NULL),(209,78,5,'100.0',NULL),(210,79,17,'81.0',NULL),(211,79,4,'63.0',NULL),(212,79,7,'39.0',NULL),(213,80,22,'78.5',NULL),(214,80,4,'76.0',NULL),(215,80,12,'74.0',NULL),(216,81,11,'81.0',NULL),(217,81,1,'51.0',NULL),(218,81,4,'60.0',NULL),(219,82,1,'80.0',NULL),(220,82,4,'91.0',NULL),(221,82,17,'77.0',NULL),(222,83,2,'87.0',NULL),(223,83,4,'51.0',NULL),(224,83,19,'76.0',NULL),(225,84,4,'54.0',NULL),(226,84,8,'62.0',NULL),(227,84,21,'84.0',NULL),(228,84,14,'87.5',NULL),(229,85,4,'78.0',NULL),(230,85,17,'90.0',NULL),(231,86,4,'76.0',NULL),(232,86,8,'84.0',NULL),(233,86,28,'90.0',NULL),(234,87,4,'87.0',NULL),(235,87,8,'81.0',NULL),(236,88,4,'91.5',NULL),(237,88,16,'75.0',NULL),(238,88,13,'77.5',NULL),(239,89,4,'64.0',NULL),(240,89,27,'82.0',NULL),(241,89,28,'60.0',NULL),(242,90,4,'78.0',NULL),(243,90,7,'68.0',NULL),(244,90,8,'51.0',NULL),(245,90,29,'95.0',NULL),(246,91,4,'68.0',NULL),(247,91,9,'96.0',NULL),(248,91,19,'79.5',NULL),(249,91,11,'82.0',NULL),(250,92,4,'66.0',NULL),(251,92,10,'58.0',NULL),(252,92,24,'54.0',NULL),(253,93,22,'69.0',NULL),(254,93,12,'54.0',NULL),(255,93,4,'79.0',NULL),(256,94,4,'88.0',NULL),(257,94,27,'88.0',NULL),(258,94,25,'83.5',NULL),(259,95,10,'89.5',NULL),(260,95,4,'89.0',NULL),(261,95,11,'49.5',NULL),(262,96,4,'83.5',NULL),(263,96,14,'48.0',NULL),(264,96,6,'89.0',NULL),(265,96,9,'66.5',NULL),(266,96,29,'84.0',NULL),(267,97,4,'72.0',NULL),(268,97,25,'83.5',NULL),(269,97,18,'63.5',NULL),(270,97,11,'97.0',NULL),(271,98,4,'74.0',NULL),(272,98,12,'92.0',NULL),(273,99,3,'79.0',NULL),(274,99,4,'69.0',NULL),(275,99,19,'91.5',NULL),(276,100,4,'60.0',NULL),(277,100,1,'92.0',NULL),(278,100,14,'69.0',NULL);
/*!40000 ALTER TABLE `achievement` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `course`
--

DROP TABLE IF EXISTS `course`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `course` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '课程编号',
  `course` varchar(255) DEFAULT NULL COMMENT '课程名称',
  `lecturer_id` smallint(5) unsigned DEFAULT NULL COMMENT '老师编号',
  `address` smallint(6) DEFAULT NULL COMMENT '上课教室',
  `addtime` int(10) unsigned DEFAULT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COMMENT='课程表';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `course`
--

LOCK TABLES `course` WRITE;
/*!40000 ALTER TABLE `course` DISABLE KEYS */;
INSERT INTO `course` VALUES (1,' Axure原型策划',1,301,NULL),(2,'Javascript',2,305,NULL),(3,'AJAX',3,302,NULL),(4,'Python',4,304,NULL),(5,'API接口',5,309,NULL),(6,'SEO',6,308,NULL),(7,'webpy',7,306,NULL),(8,'HTML5',8,303,NULL),(9,'Django',9,307,NULL),(10,'drf',10,401,NULL),(11,'爬虫',11,402,NULL),(12,'项目管理',12,403,NULL),(13,'MySQL优化',13,404,NULL),(14,'HTML',14,405,NULL),(15,'Photoshop',15,406,NULL),(16,'Memcached',16,407,NULL),(17,'go',17,408,NULL),(18,'Flask',17,409,NULL),(19,'负载均衡',18,501,NULL),(21,'数据分析',19,502,NULL),(22,'Css',20,503,NULL),(23,'Django项目',21,504,NULL),(24,'Mysql',22,505,NULL),(25,'Nginx',23,506,NULL),(26,'Linux',24,507,NULL),(27,'Flask项目',25,508,NULL),(28,'Python网络编程',26,509,NULL),(29,'Python项目',27,510,NULL);
/*!40000 ALTER TABLE `course` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `lecturer`
--

DROP TABLE IF EXISTS `lecturer`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `lecturer` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '老师编号',
  `name` varchar(255) DEFAULT NULL COMMENT '老师姓名',
  `job` varchar(255) DEFAULT NULL COMMENT '老师职称',
  `sex` tinyint(4) DEFAULT NULL COMMENT '性别',
  `age` tinyint(4) DEFAULT NULL COMMENT '年龄',
  `descripion` varchar(2000) DEFAULT NULL COMMENT '老师简介',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `lecturer`
--

LOCK TABLES `lecturer` WRITE;
/*!40000 ALTER TABLE `lecturer` DISABLE KEYS */;
INSERT INTO `lecturer` VALUES (1,'刘老师',NULL,NULL,NULL,NULL),(2,'李老师',NULL,NULL,NULL,NULL),(3,'潘老师',NULL,NULL,NULL,NULL),(4,'黄老师',NULL,NULL,NULL,NULL),(5,'宋老师',NULL,NULL,NULL,NULL),(6,'冯老师',NULL,NULL,NULL,NULL),(7,'林老师',NULL,NULL,NULL,NULL),(8,'丘老师',NULL,NULL,NULL,NULL),(9,'罗老师',NULL,NULL,NULL,NULL),(10,'叶老师',NULL,NULL,NULL,NULL),(11,'周老师',NULL,NULL,NULL,NULL),(12,'贺老师',NULL,NULL,NULL,NULL),(13,'房老师',NULL,NULL,NULL,NULL),(14,'曾老师',NULL,NULL,NULL,NULL),(15,'唐老师',NULL,NULL,NULL,NULL),(16,'吴老师',NULL,NULL,NULL,NULL),(17,'陈老师',NULL,NULL,NULL,NULL),(18,'杜老师',NULL,NULL,NULL,NULL),(19,'郑老师',NULL,NULL,NULL,NULL),(20,'何老师',NULL,NULL,NULL,NULL),(21,'易老师',NULL,NULL,NULL,NULL),(22,'简老师',NULL,NULL,NULL,NULL),(23,'曹老师',NULL,NULL,NULL,NULL),(24,'钟老师',NULL,NULL,NULL,NULL),(25,'白老师',NULL,NULL,NULL,NULL),(26,'江老师',NULL,NULL,NULL,NULL),(27,'关老师',NULL,NULL,NULL,NULL);
/*!40000 ALTER TABLE `lecturer` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `student`
--

DROP TABLE IF EXISTS `student`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `student` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '学生编号',
  `name` varchar(20) NOT NULL COMMENT '学生姓名',
  `sex` tinyint(4) DEFAULT NULL COMMENT '学生性别',
  `class` smallint(5) unsigned DEFAULT NULL COMMENT '学生班级',
  `age` tinyint(4) DEFAULT NULL COMMENT '学生年龄',
  `description` varchar(2000) DEFAULT NULL COMMENT '个性签名',
  `status` tinyint(4) DEFAULT '1' COMMENT '登录状态(1为能登录,0为不能登录)',
  `addtime` int(10) unsigned DEFAULT NULL COMMENT '入学时间',
  `orders` smallint(5) unsigned DEFAULT NULL COMMENT '学生排序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8 COMMENT='学生表';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `student`
--

LOCK TABLES `student` WRITE;
/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT INTO `student` VALUES (1,'赵华',1,307,22,'对于勤奋的人来说,成功不是偶然;对于懒惰的人来说,失败却是必然。',1,NULL,NULL),(2,'程星云',1,301,20,'人生应该如蜡烛一样,从顶燃到底,一直都是光明的。',1,NULL,NULL),(3,'陈峰',1,504,21,'在不疯狂,我们就老了,没有记忆怎么祭奠呢?',1,NULL,NULL),(4,'苏礼就',1,502,20,'不要为旧的悲伤,浪费新的眼泪。',1,NULL,NULL),(5,'张小玉',2,306,18,'没有血和汗水就没有成功的泪水。',1,NULL,NULL),(6,'吴杰',1,307,19,'以大多数人的努力程度之低,根本轮不到去拼天赋',1,NULL,NULL),(7,'张小辰',2,405,19,'人生的道路有成千上万条, 每一条路上都有它独自的风景。',1,NULL,NULL),(8,'王丹丹',2,502,22,'平凡的人听从命运,坚强的人主宰命运。',1,NULL,NULL),(9,'苗俊伟',1,503,22,'外事找谷歌,内事找百度。',1,NULL,NULL),(10,'娄镇明',1,301,22,'不经三思不求教,不动笔墨不读书。',1,NULL,NULL),(11,'周梦琪',2,306,19,'学习与坐禅相似,须有一颗恒心。',1,NULL,NULL),(12,'欧阳博',1,503,23,'春去秋来,又一年。What did you get ?',1,NULL,NULL),(13,'颜敏莉',2,306,20,'Knowledge makes humble, ignorance makes proud.',1,NULL,NULL),(14,'柳宗仁',1,301,20,'有志者事竟成。',1,NULL,NULL),(15,'谢海龙',1,402,22,'这世界谁也不欠谁,且行且珍惜。',1,NULL,NULL),(16,'邓士鹏',1,508,22,'青,取之于蓝而青于蓝;冰,水为之而寒于水。',1,NULL,NULL),(17,'宁静',2,502,23,'一息若存 希望不灭',1,NULL,NULL),(18,'上官屏儿',2,502,21,'美不自美,因人而彰。',1,NULL,NULL),(19,'孙晓静',2,503,20,'人生本过客,何必千千结;无所谓得失,淡看风和雨。',1,NULL,NULL),(20,'刘承志',1,306,20,'good good study,day day up! ^-^',1,NULL,NULL),(21,'王浩',1,503,21,'积土而为山,积水而为海。',1,NULL,NULL),(22,'钟无艳',2,303,19,'真者,精诚之至也,不精不诚,不能动人。',1,NULL,NULL),(23,'莫荣轩',1,409,22,'不管发生什么事,都请安静且愉快地接受人生,勇敢地、大胆地,而且永远地微笑着。',1,NULL,NULL),(24,'张裕民',1,303,21,'伟大的目标形成伟大的人物。',1,NULL,NULL),(25,'江宸轩',1,407,22,'用最少的悔恨面对过去。',1,NULL,NULL),(26,'谭季同',1,305,21,'人总是珍惜未得到的,而遗忘了所拥有的。',1,NULL,NULL),(27,'李松风',1,504,19,'明天的希望,让我们忘了今天的痛苦。',1,NULL,NULL),(28,'叶宗政',1,407,20,'因害怕失败而不敢放手一搏,永远不会成功。',1,NULL,NULL),(29,'魏雪宁',2,306,20,'成功与失败只有一纸之隔',1,NULL,NULL),(30,'徐秋菱',2,404,19,'年轻是我们唯一拥有权利去编织梦想的时光。',1,NULL,NULL),(31,'曾嘉慧',2,301,19,'有一分热,发一分光。就令萤火一般,也可以在黑暗里发一点光,不必等候炬火。',1,NULL,NULL),(32,'欧阳镇安',1,408,23,'青春虚度无所成,白首衔悲补何及!',1,NULL,NULL),(33,'周子涵',2,309,19,'青春是一个普通的名称,它是幸福美好的,但它也是充满着艰苦的磨炼。',1,NULL,NULL),(34,'宋应诺',2,501,23,'涓滴之水终可以磨损大石,不是由于它力量强大,而是由于昼夜不舍的滴坠。',1,NULL,NULL),(35,'白瀚文',1,305,19,'一个人假如不脚踏实地去做,那么所希望的一切就会落空。',1,NULL,NULL),(36,'陈匡怡',2,505,19,'一份耕耘,一份收获。',1,NULL,NULL),(37,'邵星芸',2,503,22,'冰冻三尺非一日之寒。',1,NULL,NULL),(38,'王天歌',2,302,21,'任何的限制,都是从自己的内心开始的。',1,NULL,NULL),(39,'王天龙',1,302,22,'再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。',1,NULL,NULL),(40,'方怡',2,509,23,'智者不做不可能的事情。',1,NULL,NULL),(41,'李伟',1,505,19,'人之所以能,是相信能。',1,NULL,NULL),(42,'李思玥',2,503,22,'人的一生可能燃烧也可能腐朽,我不能腐朽,我愿意燃烧起来。',1,NULL,NULL),(43,'赵思成',1,401,18,'合抱之木,生于毫末;九层之台,起于累土。',1,NULL,NULL),(44,'蒋小媛',2,308,22,'不积跬步无以至千里,不积细流无以成江河。',1,NULL,NULL),(45,'龙华',1,510,19,'只要持续地努力,不懈地奋斗,就没有征服不了的东西。',1,NULL,NULL),(46,'牧婧白夜',2,501,21,'读不在三更五鼓,功只怕一曝十寒。',1,NULL,NULL),(47,'江俊文',1,304,19,'立志不坚,终不济事。',1,NULL,NULL),(48,'李亚容',2,304,18,'Keep on going never give up.',1,NULL,NULL),(49,'王紫伊',2,301,22,'最可怕的敌人,就是没有坚强的信念。',1,NULL,NULL),(50,'毛小宁',1,501,19,'要从容地着手去做一件事,但一旦开始,就要坚持到底。',1,NULL,NULL),(51,'董 晴',2,507,19,'常常是最后一把钥匙打开了门。贵在坚持',1,NULL,NULL),(52,'严语',2,405,18,'逆水行舟,不进则退。',1,NULL,NULL),(53,'陈都灵',2,503,19,'无论什么时候,不管遇到什么情况,我绝不允许自己有一点点灰心丧气。',1,NULL,NULL),(54,'黄威',1,301,23,'我的字典里面没有“放弃”两个字',1,NULL,NULL),(55,'林佳欣',2,308,23,'梦想就是一种让你感到坚持,就是幸福的东西。',1,NULL,NULL),(56,'翁心颖',2,303,19,'有目标的人才能成功,因为他们知道自己的目标在哪里。',1,NULL,NULL),(57,'蒙毅',1,502,22,'所谓天才,就是努力的力量。',1,NULL,NULL),(58,'李小琳',2,509,22,'每天早上对自己微笑一下。这就是我的生活态度。',1,NULL,NULL),(59,'伍小龙',1,406,19,'一路上的点点滴滴才是我们的财富。',1,NULL,NULL),(60,'晁然',2,305,23,'人的价值是由自己决定的。',1,NULL,NULL),(61,'端木浩然',1,507,18,'摔倒了爬起来再哭。',1,NULL,NULL),(62,'姜沛佩',2,309,21,'Believe in yourself.',1,NULL,NULL),(63,'李栋明',1,306,19,'虽然过去不能改变,但是未来可以。',1,NULL,NULL),(64,'柴柳依',2,508,23,'没有实践就没有发言权。',1,NULL,NULL),(65,'吴杰',1,401,22,'人生有两出悲剧。一是万念俱灰;另一是踌躇满志',1,NULL,NULL),(66,'杜文华',1,507,19,'有智者立长志,无志者长立志。',1,NULL,NULL),(67,'邓珊珊',2,510,18,'Action is the proper fruit of knowledge.',1,NULL,NULL),(68,'杜俊峰',1,507,23,'世上无难事,只要肯登攀。',1,NULL,NULL),(69,'庄信杰',1,301,22,'知识就是力量。',1,NULL,NULL),(70,'宇文轩',1,402,23,'如果你想要某样东西,别等着有人某天会送给你。生命太短,等不得。',1,NULL,NULL),(71,'黄佳怿',2,510,19,'Learn and live.',1,NULL,NULL),(72,'卫然',1,510,18,'神于天,圣于地。',1,NULL,NULL),(73,'耶律齐',1,307,23,'如果不是在海市蜃楼中求胜,那就必须脚踏实地去跋涉。',1,NULL,NULL),(74,'白素欣',2,305,18,'欲望以提升热忱,毅力以磨平高山。',1,NULL,NULL),(75,'徐鸿',1,403,23,'最美的不是生如夏花,而是在时间的长河里,波澜不惊。',1,NULL,NULL),(76,'上官杰',1,409,19,'生活之所以耀眼,是因为磨难与辉煌会同时出现。',1,NULL,NULL),(77,'吴兴国',1,406,18,'生活的道路一旦选定,就要勇敢地走到底,决不回头。',1,NULL,NULL),(78,'庄晓敏',2,305,18,'Never say die.',1,NULL,NULL),(79,'吴镇升',1,509,18,'Judge not from appearances.',1,NULL,NULL),(80,'朱文丰',1,304,19,'每个人都比自己想象的要强大,但同时也比自己想象的要普通。',1,NULL,NULL),(81,'苟兴妍',2,508,18,'Experience is the best teacher.',1,NULL,NULL),(82,'祝华生',1,302,21,'浅学误人。',1,NULL,NULL),(83,'张美琪',2,404,23,'最淡的墨水,也胜过最强的记性。',1,NULL,NULL),(84,'周永麟',1,308,21,'All work and no play makes Jack a dull boy.',1,NULL,NULL),(85,'郑心',2,404,21,'人生就像一杯茶,不会苦一辈子,但总会苦一阵子。',1,NULL,NULL),(86,'公孙龙馨',1,510,21,'Experience is the father of wisdom and memory the mother.',1,NULL,NULL),(87,'叶灵珑',2,401,19,'读一书,增一智。',1,NULL,NULL),(88,'上官龙',1,501,21,'别人能做到的事,自己也可以做到。',1,NULL,NULL),(89,'颜振超',1,303,19,'如果要飞得高,就该把地平线忘掉。',1,NULL,NULL),(90,'玛诗琪',2,409,22,'每天进步一点点,成功不会远。',1,NULL,NULL),(91,'李哲生',1,309,22,'这不是偶然的失误,是必然的结果。',1,NULL,NULL),(92,'罗文华',2,408,22,'好走的都是下坡路。',1,NULL,NULL),(93,'李康',1,509,19,'Deliberate slowly, promptly.',1,NULL,NULL),(94,'钟华强',1,405,19,'混日子很简单,讨生活比较难。',1,NULL,NULL),(95,'张今菁',2,403,23,'不经一翻彻骨寒,怎得梅花扑鼻香。',1,NULL,NULL),(96,'黄伟麟',1,407,19,'与其诅咒黑暗,不如燃起蜡烛。没有人能给你光明,除了你自己。',1,NULL,NULL),(97,'程荣泰',1,406,22,'明天不一定更好,。但更好的明天一定会来。',1,NULL,NULL),(98,'范伟杰',1,508,19,'水至清则无鱼,人至察则无徒。凡事不能太执着。',1,NULL,NULL),(99,'王俊凯',1,407,21,'我欲将心向明月,奈何明月照沟渠。',1,NULL,NULL),(100,'白杨 ',1,406,19,'闪电从不打在相同的地方.人不该被相同的方式伤害两次。',1,NULL,NULL);
/*!40000 ALTER TABLE `student` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2016-07-22 17:29:22



连接mysql数据库

#!/usr/bin/env python3
# author: Alnk

# 需要安装 pymysql 模块
# pip install pymysql
import pymysql


# 1. 创建和数据库服务的链接
conn = pymysql.connect(
    host='192.168.3.121',
    port=3306,
    user='root',
    password='root123',
    charset='utf8mb4',
    db='student'
)


# 2. 创建游标对象
cursor = conn.cursor()


# 3. 中间可以使用游标完成对数据库的操作
sql = "select * from student;"


# 4. 执行sql语句函数,返回值是sql语句的影响行数
count = cursor.execute(sql)
print('被影响的行数', count)  # 被影响的行数 100
print("---------------- 1 ----------------------------")

print(cursor.fetchone())    # 获取一行数据,类型为元组
print("---------------- 2 ----------------------------")
# (1, '赵华', 1, 307, 22, '对于勤奋的人来说,成功不是偶然;对于懒惰的人来说,失败却是必然。', 1, None, None)


print(cursor.fetchmany(3))  # 获取多行数据
print("---------------- 3 ----------------------------")
# 注意,前面已经读取了一行,所以直接从第二行开始读
# (
# (2, '程星云', 1, 301, 20, '人生应该如蜡烛一样,从顶燃到底,一直都是光明的。', 1, None, None),
# (3, '陈峰', 1, 504, 21, '在不疯狂,我们就老了,没有记忆怎么祭奠呢?', 1, None, None),
# (4, '苏礼就', 1, 502, 20, '不要为旧的悲伤,浪费新的眼泪。', 1, None, None)
# )


# 5. 格式化输出本次操作的所有数据
# print(cursor.fetchall())    # 获取全部数据
for line in cursor.fetchall():
    print(line)


# 6. 关闭资源,先关闭游标,在关闭连接
cursor.close()
conn.close()

# 注意,如果是修改,插入数据,需要提交语句,只是查询则不需要
# conn.commit()



#!/usr/bin/env python3
# author: Alnk(李成果)
import pymysql


# 插入一条数据


# 1.创建连接
conn = pymysql.connect(
    host='192.168.3.121',
    port=3306,
    user='root',
    password='root123',
    db='student',
    charset='utf8mb4'
)


# 2.创建游标
cursor = conn.cursor()


# 3.编写sql语句
sql = "insert into student (name,sex,class,age) value ('tom','2','405','38')"


# 4.执行sql语句
cursor.execute(sql)


# 5.提交
conn.commit()


# 6.结束关闭
cursor.close()
conn.close()



#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/26 5:06 下午
"""
import pymysql


# 删除一条数据


# 1.创建连接
conn = pymysql.connect(
    host='192.168.3.121',
    port=3306,
    user='root',
    password='root123',
    db='student',
    charset='utf8mb4'
)


# 2.创建游标
cursor = conn.cursor()


# 3.编写sql语句
sql = "delete from student where name = 'tom';"


# 4.执行sql语句
tag = cursor.execute(sql)


# 5.提交
conn.commit()


print(tag)  # 影响的行数 1


# 6.结束关闭
cursor.close()
conn.close()



#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/26 5:06 下午
"""
import pymysql


# 修改一条数据


# 1.创建连接
conn = pymysql.connect(
    host='192.168.3.121',
    port=3306,
    user='root',
    password='root123',
    db='student',
    charset='utf8mb4'
)


# 2.创建游标
cursor = conn.cursor()


# 3.编写sql语句
sql = "update student set age=18 where name = 'tom';"

# 4.执行sql语句
cursor.execute(sql)


# 5.提交
conn.commit()


# 6.结束关闭
cursor.close()
conn.close()



#!/usr/bin/env python3
# author: Alnk(李成果)
import pymysql


# 需求
# 获取所有女生的信息[id,name,sex,age]


# 1.创建连接
conn = pymysql.connect(
    host='192.168.3.121',
    port=3306,
    user='root',
    password='root123',
    db='student',
    charset='utf8mb4'
)


# 2.创建游标
cursor = conn.cursor()


# 3.编写sql语句
sql = "select id, name, sex, age from student where sex = 2 "


# 4.执行sql语句
count = cursor.execute(sql)


# 5.格式化输出
print("总计: %s" % count)
for line in cursor.fetchall():
    print(line)


# 6.结束关闭
cursor.close()
conn.close()



练习

-- 查询出班级205有多少个男生
select count(1)  from student where class = '305' and sex = '1';


-- 查询出名字为4个字的所有学生信息(编号、姓名,年龄,班级)
select id,name,age,class from student where name like '____';


-- 查询出所有姓王的学生信息(编号、姓名,年龄,班级)
select id,name,age,class from student where name like '王%';


-- 查询出班级编号为301,203,303的女生总人数
select count(1) from student where class in (301,203,303);


-- 查询出学号整十的所有女生信息(姓名、年龄、个人简介)
select name,age,description from student where id%10=0 and sex = '2';


-- 删除301班级中年龄在23岁以上的学生信息
-- select id,name,age from student where class = '301' and age >= '23';
delete from student where class = '301' and age >= '23';


-- 把一个叫'卫然'的学生的性别改成女的
select name,sex from student where name='卫然';
update student set sex = 2 where name='卫然';


-- 把401班级中的姓名为'吴杰'的学生信息删除
delete from student where class = 401 and name = '吴杰';


-- 计算305班中所有学生的平均年龄以及他们的最大年龄和最小年龄
select max(age),min(age),avg(age) from student where class = 305;


-- 查询401,402,403,404,405中所有学生的年龄平均值
select avg(age) from student where class in (401,402,403,404,405);


-- 查询出所有学生中名字带"白"字的学生信息,并对他们使用年龄进行升序排列
select name,age from student where name like '%白%' order by age asc;


-- 添加以下学生记录到数据表中
-- 姓名     年龄    性别    班级   个性签名
-- 张三丰    22      1      301   我是武当老板
-- 张翠山    21      1      302   我是武当老板的五弟子
-- 张无忌    20      1      302   明教老板
insert into student (name,age,sex,class,description) VALUES
('张三丰',22,1,301,'我是武当老板'),
('张翠山',21,1,302,'我是武当老板的五弟子'),
('张无忌',20,1,302,'明教老板');


-- 查询年龄在18-20之间的姓李的女生
select id,name,age,sex from student where (age between 18 and 20) and sex = 2 and (name like '李%');


-- 查询年龄在18-20之间的所有女生,并按照编号进行降序排序
select id,name,age,sex from student where (age between 18 and 20) and sex = 2 ORDER BY id desc;


-- 查询出301,302,303,304,305,306中每个班级总人数。
select class,count(1) as 总人数 from student WHERE class in (301,302,303,304,305,306) group by class;


-- 查询出学号为9的学生的总成绩
select sid,sum(achievement) from achievement where sid=9;


-- 查询出课程编号为4的课程平均成绩
select cid,avg(achievement) from achievement where cid=4;


-- 查询出学号为6的学生的所有成绩,并显示对应的课程编号。
select sid,achievement,cid from achievement where sid=6;


-- 查询出课程编号为20的课程成绩,并进行分数的降序排列,显示10个成绩即可
select cid,achievement from achievement where cid=20 ORDER BY achievement desc limit 10 ;


-- 查询出学号为1,2,3,4,5,6这几个学员的平均成绩。
select sid,avg(achievement) from achievement where sid in (1,2,3,4,5,6) group by sid;


-- 查询出成绩表中每个学科的平均成绩
select cid,avg(achievement) from achievement GROUP BY cid;




Redis

redis介绍

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 9:54 上午
"""
# 1. redis简介
# redis是一个 key-value 存储系统
# 它支持存储的value类型很多
# 包括string(字符串)、list(列表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)
# 这些数据类型都支持 push/pop、add/remove 及 取交集、并集、差集等更丰富的操作,而且这些操作都是原子性的
# 在此基础上,redis支持各种不同方式的排序,为了保证效率,数据都是缓存在内存中
# redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步

# 1.1 使用Redis有哪些好处?
# 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
# 支持丰富数据类型,支持string,list,set,sorted set,hash
# 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
# 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

# 1.2 redis相比memcached有哪些优势?
# memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
# redis的速度比memcached快很多
# redis可以持久化其数据

# 1.3 redis常见性能问题和解决方案?
# Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
# 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
# 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
# 尽量避免在压力很大的主库上增加从库
# 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
# 这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变

# 1.4 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
# 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
# redis 提供 6种数据淘汰策略
# voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
# volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
# volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
# allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
# allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
# no-enviction(驱逐):禁止驱逐数据

# 1.5 Memcache与Redis的区别都有哪些?
# 1.5.1 存储方式
# Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
# Redis有部份存在硬盘上,这样能保证数据的持久性
# 1.5.2 数据支持类型
# Memcache对数据类型支持相对简单
# Redis有复杂的数据类型
# 1.5.3 value大小
# redis最大可以达到1GB,而memcache只有1MB

# 1.6 Redis 常见的性能问题都有哪些?如何解决?
# 1.6.1 Master写内存快照
# save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照
# 1.6.2 Master AOF持久化
# 如果不重写AOF文件,这个持久化方式对性能的影响是最小的
# 但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度
# Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化
# 如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次
# 1.6.3 Master调用BGREWRITEAOF重写AOF文件
# AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象
# 1.6.4 Redis主从复制的性能问题
# 为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

# 1.7 redis 最适合的场景
# Redis最适合所有数据in-memory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别
# 1.7.1 会话缓存(Session Cache)
# 最常用的一种使用Redis的情景是会话缓存(session cache)
# 用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化
# 当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,
# 幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档
# 1.7.2 全页缓存(FPC)
# 除基本的会话token之外,Redis还提供很简便的FPC平台。
# 回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。
# 1.7.3 队列
# Redis在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用
# Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作
# 1.7.4 排行榜/计数器
# Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单
# Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,
# 我们只需要像下面一样执行即可:
# 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行
# ZRANGE user_scores 0 10 WITHSCORES
# 1.7.5 发布/订阅
# 最后(但肯定不是最不重要的)是Redis的发布/订阅功能。
# 发布/订阅的使用场景确实非常多。
# 我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统



连接redis

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/26 5:22 下午
"""
# 安装redis模块
# pip3 install redis
# redis模块提供两个类Redis和StrictRedis用于实现Redis的命令,官方推荐使用StrictRedis类,不推荐Redis类
# StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令
# Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py


# 导入redis模块
import redis


# 1 Redis
# 创建redis链接对象
r = redis.Redis(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,  # 这个参数决定返回结果是否decode, 表示输出为字符串
)

# 存储键值对
r.set("test_k1", "test_v1")

# 获取值
print(r.get("test_k1"))  # test_v1
print("------------- 1 ------------------------")


# 2 StrictRedis
# 创建redis链接对象
red = redis.StrictRedis(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)

# 存储键值对
red.lpush("list1", "mongodb", "redis", "mysql")

# 获取值
print(red.lrange("list1", 0, -1))  # ['mysql', 'redis', 'mongodb']
print(red.llen("list1"))           # 3


# 默认redis入库编码是utf-8,如果要修改的话,需要指明 charset 和 decode_responses=True
# test = redis.StrictRedis(
#     host='localhost',
#     port=6379,
#     db=0,
#     password=None,
#     socket_timeout=None,
#     connection_pool=None,
#     charset='utf-8',
#     errors='strict',
#     decode_responses=False,
#     unix_socket_path=None
# )



redis连接池

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 10:50 上午
"""
import redis


# 创建连接池
pool = redis.ConnectionPool(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)


# Redis连接连接池
# 创建链接对象
r = redis.Redis(connection_pool=pool)

# 设置集合
r.sadd("set1", "v1", "v2", "v3")

# 显示集合
print(r.smembers("set1"))  # {'v2', 'v3', 'v1'}

# 设置集合
r.sadd("set1", "v2")

# 显示集合
print(r.smembers("set1"))  # {'v2', 'v3', 'v1'}
print("----------- 1 ----------------------------")


# strictRedis连接连接池
rs = redis.StrictRedis(connection_pool=pool)

# 设置列表
rs.lpush("list2", "python", "go", "js")

# 获取列表全部数据
print(rs.lrange("list2", 0, -1))  # ['js', 'go', 'python']
print("----------- 2 ----------------------")



redis常用操作-string

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 10:59 上午
"""
# redis中的String在在内存中按照一个name对应一个value来存储的
# set key value [EX seconds] [PX milliseconds] [NX|XX]
# 参数
# EX 过期时间(秒)
# PX 过期时间(毫秒)
# NX 如果设置为True,则只有name不存在时,当前set操作才执行,保证redis数据安全
# XX 如果设置为True,则只有name存在时,当前set操作才执行


import redis


# 创建连接池
pool = redis.ConnectionPool(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)

# 创建链接对象
r = redis.StrictRedis(connection_pool=pool)

# 设置值
r.set("test_k2", "test_v2", ex=3, nx=True)

# 获取值
print(r.get("test_k2"))  # test_v2
print("----------- 1 ---------------------")


# 常用操作
# setnx(name,value):设置值,只有在name不存在是才执行操作
r.setnx("test_k3", "v3")

# setex(name, time, value):设置值过期时间,单位为秒
r.setex("test_k4", 100, "v4")

# psetex(name,time_ms,value):设置值,过期时间为毫秒
r.psetex("test_k5", 100000, "v5")

# mset(*args,**kwargs):批量设置多个值
r.mset({"test_k6": "v6", "test_k7": "v7"})

# get(name):获取值
print(r.get("test_k6"))
print(r.get("test_k7"))

# getrange(key,start,end):获取子序列,根据字节获取
r.set("test_k8", "abcdefg")
print(r.getrange("test_k8", 1, 2))  # bc
r.set("test_k9", "a中国bc")
print(r.getrange("test_k9", 0, 3))  # a中 注意到2结束会报错,根据字节获取

# setrange(name,oofset,value):修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
r.setnx("test_k10", "abcdefghijklmn")
r.setrange("test_k10", 2, "中国")
print(r.get("test_k10"))  # ab中国ijklmn

# setbit(name,offset,value):对name对应值的二进制表示的位进行操作
# getbit(name,offset):获取name对应的二进制位表示的值,只能是0或1
r.set("test_k11", "p")
print(r.get("test_k11"))   # p
# 打印p,q对应的ascii码
print(ord("p"), ord("q"))  # 112 113
# 打印ascii码对应的二进制
print(bin(ord('p')), bin(ord('q')))  # 01110000 01110001
print('修改之前,第7位的值为: ', r.getbit('test_k11', '7'))  # 0
# 设置二进制位的第7位为1,相当于移动ascii码位112为113对应的字符为q
r.setbit('test_k11', '7', '1')
print('修改以后,第7位的值为: ', r.getbit('test_k11', '7'))  # 1
print(r.get('test_k11'))  # q
print("----------- 2 ---------------------")

# strlen(name):返回name对应值的字节长度,一个汉字3个字节
r.setnx("test_k12", "中a")
print(r.strlen("test_k12"))  # 4

# incr(self,name,amount=1):自增 name对应的值,当name不存在时,则创建name=1,否则自增
r.set("test_k13", "1")
r.incr("test_k13")
print(r.get("test_k13"))  # 2
r.incr("test_k13", "3")
print(r.get("test_k13"))  # 5

# decr(self,name,amount=1):自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减
r.set("test_k14", "10")
r.decr("test_k14", "3")
print(r.get("test_k14"))  # 7
r.decr("test_k15")
print(r.get("test_k15"))  # -1

# append(key,value):在name对应的值后面追加内容
r.set("test_k16", "10")
print(r.get("test_k16"))  # 10
r.append("test_k16", "111")
print(r.get("test_k16"))  # 10111


redis常用操作-hash

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 11:56 上午
"""
import redis


# 创建连接池
pool = redis.ConnectionPool(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)

# 创建链接对象
r = redis.StrictRedis(connection_pool=pool)

# 设置值
# hset(name,key,value):在name对应的hash中设置一个键值对,不存在则创建否则修改
r.hset("h_set", "python", "3.5")

# 获取值
# hget(name,key):获取hash中的value
print(r.hget("h_set", "python"))  # 3.5

# 设置值
r.hset("h_set", "redis", "4.0")
# 获取值
print(r.hget("h_set", "redis"))  # 4.0

# 获取h_set所有值
# hgetall(name): 获取hash的所有键值对
print(r.hgetall("h_set"))  # {'python': '3.5', 'redis': '4.0'}
print("------------------- 1 -------------------------------")


# hmset(name,mapping):在name对应的hash中批量设置键值对
r.hmset("hash_more", {"k1": "v1", "k2": "v2", "k3": "v3"})
print(r.hget("hash_more", "k1"))   # v1
print(r.hgetall("hash_more"))      # {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
print("------------------- 2 -------------------------------")

# hmget(name,keys,*args):获取多个hash的key的值
print(r.hmget("hash_more", "k1"))               # ['v1']
print(r.hmget("hash_more", "k1", "k2", "k3"))   # ['v1', 'v2', 'v3']
print("------------------- 3 -------------------------------")


# hlen(name):获取hash中键值对的个数
print(r.hlen("hash_more"))   # 3
print("------------------- 4 -------------------------------")


# hkeys(name):获取hash中所有keys的值
print(r.hkeys("hash_more"))   # ['k1', 'k2', 'k3']
print("------------------- 5 -------------------------------")


# hvals(name):获取hash中所有value的值
print(r.hvals("hash_more"))  # ['v1', 'v2', 'v3']
print("------------------- 6 -------------------------------")


# hexists(name,key):检查hash中是否存在key
print(r.hexists("hash_more", "k1"))   # True
print(r.hexists("hash_more", "k5"))   # False
print("------------------- 7 -------------------------------")


# hdel(name,*key):删除hash中的key
print(r.hexists("hash_more", "k1"))    # True
r.hdel("hash_more", "k1")
print(r.hexists("hash_more", "k1"))    # False
print("------------------- 8 -------------------------------")


# hincrby(name,key,amount=1):自增hash中指定的key的值,不存在则创建key=amount
r.hmset("hash_t1", {"k1": "1", "k2": "2", "k3": 3})
print(r.hgetall("hash_t1"))        # {'k1': '1', 'k2': '2', 'k3': '3'}
r.hincrby("hash_t1", "k1", "2")
print(r.hgetall("hash_t1"))        # {'k1': '3', 'k2': '2', 'k3': '3'}
r.hincrby("hash_t1", "k4", "4")
print(r.hgetall("hash_t1"))        # {'k1': '3', 'k2': '2', 'k3': '3', 'k4': '4'}
print("------------------- 9 -------------------------------")


# hscan(name,cursor=0,match=None,count=None):增量迭代获取hash中数据,cursor游标,match匹配key默认所有,count获取的个数。
r.hmset('hash_t3', {'k1': '1', 'k2': '2', 'k3': '3', 'k4': '4', 'k1aa': '1', 'k2ab': '2', 'k3ac': '3', 'k4ad': '4af'})

print(r.hgetall('hash_t3'))
# {'k2': '2', 'k3': '3', 'k4': '4', 'k1aa': '1', 'k2ab': '2', 'k3ac': '3', 'k4ad': '4af', 'k1': '1'}

print(r.hscan('hash_t3', cursor=2, match='k2*', count=2))  # (0, {'k2': '2', 'k2ab': '2'})
print(r.hscan('hash_t3', cursor=2, match='k2*'))           # (0, {'k2': '2', 'k2ab': '2'})

print(r.hscan('hash_t3', cursor=2, match='k*'))
# (0, {'k2': '2', 'k3': '3', 'k4': '4', 'k1aa': '1', 'k2ab': '2', 'k3ac': '3', 'k4ad': '4af', 'k1': '1'})

print(r.hscan('hash_t3'))
# (0, {'k2': '2', 'k3': '3', 'k4': '4', 'k1aa': '1', 'k2ab': '2', 'k3ac': '3', 'k4ad': '4af', 'k1': '1'})
print("------------------- 10 -------------------------------")


# hscan_iter(name,match=None,count=None):利用yield封装hscan创建生成器,实现分批获取数据
r.hmset('hash_t4', {'k1': '1', 'k2': '2', 'k3': '3', 'k4': '4', 'k5': '5', 'k6': '6', 'k7': '7', 'k8': '8'})
n1 = r.hscan_iter("hash_t4")
print(next(n1))    # ('k1', '1')
print(next(n1))    # ('k2', '2')
print(next(n1))    # ('k3', '3')
print(next(n1))    # ('k4', '4')


redis常用操作-list

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 2:38 下午
"""
import redis


# 创建连接池
pool = redis.ConnectionPool(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)

# 创建链接对象
r = redis.StrictRedis(connection_pool=pool)


# lpush(name,values):在列表中添加元素,每个新元素都从左边开始添加
r.lpush("list_1", 1, 2)

# lrange(name, start, end): 获取列表中的元素
print(r.lrange("list_1", 0, -1))  # ['2', '1']

r.lpush("list_1", "88")
print(r.lrange("list_1", 0, -1))  # ['88', '2', '1']
print("-------------- 1 --------------------------")

# lpushx(name,value):在列表中添加元素,只有在name存在时才添加
r.lpushx("list_4", 1)
print(r.lrange("list_4", 0, -1))  # []

r.lpush("list_4", 2)
r.lpushx("list_4", 1)
print(r.lrange("list_4", 0, -1))  # ['1', '2']
print("-------------- 2 --------------------------")

# llen(name):name对应的list元素的长度
print(r.llen("list_4"))
print("-------------- 3 --------------------------")

# linsert(name, where, refvalue, value) 在name对应的列表的某个值前或后插入一个新值,
# where指定前或后(before/after),refvalue参考值即指定的元素,value要插入的值
r.lpush("list_5", 1, 2)
r.linsert("list_5", "after", 2, "python")
r.linsert("list_5", "before", 1, "redis")
print(r.lrange("list_5", 0, -1))  # ['2', 'python', 'redis', '1']
print("-------------- 4 --------------------------")

# lset(name,index,value): 对列表中的某个索引位的值修改
r.lpush("list_6", 1, 2, 3, "a", "b", "c")
print(r.lrange("list_6", 0, -1))    # ['c', 'b', 'a', '3', '2', '1']
r.lset("list_6", "3", "AA")
print(r.lrange("list_6", 0, -1))    # ['c', 'b', 'a', 'AA', '2', '1']
print("-------------- 5 --------------------------")

# lrem(name,count,value):在name对应的list中删除指定的值
r.lpush("list_9", 1, 2, 3, "a", "b", "b", "c", 1,)
print(r.lrange("list_9", 0, -1))  # ['1', 'c', 'b', 'b', 'a', '3', '2', '1']
r.lrem("list_9", 1, "b")
print(r.lrange("list_9", 0, -1))  # ['1', 'c', 'b', 'a', '3', '2', '1']
print("-------------- 6 --------------------------")

# lpop(name):在name对应的列表的左侧获取第一个元素并删除,并返回参数的元素
# lindex(name,index):在name对应的列表中根据索引获取列表元素
# ltrim(name,start,end):在name对应的列表中移除start到end之间的值
# lrange(name,start,end):列表分片获取数据
# rpoplush(src,dst):获取源列表最后一个元素的值,并将它添加到目标列表中的最左边
# blpop(keys,timeout):将多个列表排列,按照从左到右去pop对应列表的元素
# brpoplpush(src,dst,timeout=0):从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧


redis常用操作-set

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 3:35 下午
"""
import redis


# 创建连接池
pool = redis.ConnectionPool(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)

# 创建链接对象
r = redis.StrictRedis(connection_pool=pool)


# sadd(name,values):添加元素到集合
# scard(name):获取集合中元素的个数
# sdiff(keys,*args):在第一个集合中的元素且不在其他集合的元素的集合
r.sadd('s1', 1, 2, 3)
r.sadd('s2', 4, 5, 2)
r.sadd('s3', 7, 8, 1)
print(r.sdiff('s1', 's2', 's3'))  # {'3'}
print("---------- 1 --------------------------------")


# sdiffstore(dest,keys,*args):在第一个keys中的集合元素且不在其他集合中的元素添加到dest新集合中
r.sdiffstore('s4', 's1', 's2', 's3')
print(r.smembers('s4'))  # {'3'}
print("---------- 2 --------------------------------")


# sinter(keys,*args):获取多个集合的并集
r.sadd('s1', 1, 2, 3)
r.sadd('s2', 4, 5, 2)
print(r.sinter('s1', 's2'))  # {'2'}
print("---------- 3 --------------------------------")


# sinterstore(dest, keys, *args):获取多个集合的并集并将结果加入到dest集合中
r.sadd('sex1', 1, 2, 3, 4)
r.sadd('sex2', 4, 5, 2, 7)
r.sadd('sex3', 7, 8, 1, 4, 2)
r.sinterstore('sex4', 'sex1', 'sex2', 'sex3')
print(r.smembers('sex4'))  # {'2', '4'}
print("---------- 4 --------------------------------")


# sismember(name,value):检查value是否在集合中
r.sadd('sex3', 7, 8, 1, 4, 2)
print(r.sismember('sex3', '8'))  # True
print(r.sismember('sex3', '9'))  # False
print("---------- 5 --------------------------------")


# smembers(name):获取集合的所有成员

# smove(src,dst,value):将源集合中的某个成员移动到目标集合中

# spop(name):从集合的右侧(尾部)移除一个成员,并将其返回

# srandmember(name,numbers):从name对应的集合中随机获取 numbers 个元素

# srem(name,values):在name对应的集合中删除某些值

# sunion(keys,*args):并集显示多个集合元素

# sunionstore(dest,keys,*args):获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中

# sscan(name,cursor=0,match=None,count=None):同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大

# sscan_iter(name,match=None,count=None):同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大


redis常用操作-有序集合

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 3:44 下午
"""
import redis


# 创建连接池
pool = redis.ConnectionPool(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)

# 创建链接对象
r = redis.StrictRedis(connection_pool=pool)


# 在集合的基础上,为每个元素排序,元素的排序需要根据另外一个值来进行比较,
# 所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序

# zadd(name,*args,**kwargs):在name对应的有序集合中添加元素

# zcard(name):获取name对应的有序集合元素的数量

# zcount(name,min,max):获取name对应的有序集合中分数 在 [min,max] 之间的个数

# zincrby(name,value,amount):自增name对应的有序集合的 name 对应的分数

# r.zrange(name, start, end, desc=False, withscores=Flase, score_cast_func=float):按照索引范围获取name对应的有序集合的元素

# zrank(name, value):获取某个值在 name对应的有序集合中的排行(从 0 开始)

# zrangebylex(name, min, max, start=None, num=None):当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的 值

# zrem(name, values):删除name对应的有序集合中值是values的成员

# zremrangebyrank(name, min, max): 根据排行范围删除

# zremrangebyscore(name, min, max):根据分数范围删除

# zremrangebylex(name, min, max):根据值返回删除

# zscore(name, values):获取name对应有序集合中 value 对应的分数

# zinterstore(dest, keys, aggregate=None):获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作

# zunionstore(dest, keys, aggregate=None):获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作

# zscan(name, cursor=0, match=None, count=None, score_cast_func=float):同字符串相似,相较于字符串新增score_cast_func,用来对分数进行操作

# zscan_iter(name, match=None, count=None,score_cast_func=float):同字符串相似,相较于字符串新增score_cast_func,用来对分数进行操作


redis常用操作-管道操作

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 4:02 下午
"""
# python对redis管道操作
# redis默认在执行每次请求都会创建(连接池申请链接)和断开(归还连接池)一次连接操作,
# 如果想要再一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,
# 并且默认情况下一次pipline是原子性操作
import redis


# 创建连接池
pool = redis.ConnectionPool(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)

# 创建链接对象
r = redis.StrictRedis(connection_pool=pool)

# 管道操作
pipe = r.pipeline()

pipe.set("p1", "python")
pipe.set("p2", "js")
pipe.set("p3", "go")

pipe.execute()  # 上面的set要么全部执行成功,要么一个都不执行


redis常用操作-其他

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
# @Author: Alnk(李成果)
# @Email: 1029612787@qq.com
# @Date: 2021/4/27 3:50 下午
"""
import redis


# 创建连接池
pool = redis.ConnectionPool(
    host="192.168.3.104",
    port=6380,
    decode_responses=True,
)

# 创建链接对象
r = redis.StrictRedis(connection_pool=pool)

# delete(*name):根据删除redis中的任意数据类型
# string
r.set("d1", "v1")
print(r.get("d1"))  # v1
r.delete("d1")
print(r.get("d1"))  # None
print("------- 1 -----------")

# hash
r.hset("h_set", "python", "3.5")
print(r.hget("h_set", "python"))  # 3.5
r.delete("h_set")
print(r.hget("h_set", "python"))  # None
print("------- 2 -----------")

# exists(name):检测redis的name是否存在
print(r.exists("d1"))  # 0
r.set("d2", "v2")
print(r.exists("d2"))  # 1
print("------- 2 -----------")

# keys(pattern='*'):根据模型获取redis的name
r.mset({"d1": "v1", "d2": "v2", "d3": "v3", "k1": "vk1", "k2": "vk1", "k3": "vk1"})
print(r.keys(pattern="k*"))  # ['k2', 'k3', 'k1']
print(r.keys(pattern="d*"))  # ['d1', 'd3', 'd2']
print("------- 3 -----------")

# expire(name, time):为某个redis的某个name设置超时时间
r.set("e1", "v1")
r.expire("e1", 10)

# rename(src, dst):对redis的name重命名为
r.set("r1", "v1")
r.rename("r1", "rr1")

# move(name, db):将redis的某个值移动到指定的db下


# randomkey():随机获取一个redis的name(不删除)
print(r.randomkey())
print("------- 4 -----------")

# type(name):获取name对应值的类型
r.set("t1", "v1")
print(r.type("t1"))  # string
r.set("t2", 1)
print(r.type("t2"))  # string

r.lpush("t3", 1, 2, 3, 4)
print(r.type("t3"))  # list

r.hset("h_set", "python", "3.5")
print(r.hgetall("h_set"))  # {'python': '3.5'}
print(r.type("h_set"))     # hash

# scan(cursor=0, match=None, count=None):同字符串操作,用于增量迭代获取key

# scan_iter(match=None, count=None):同字符串操作,用于增量迭代获取key


posted @ 2021-04-27 16:24  李成果  阅读(52)  评论(0编辑  收藏  举报