Navicat使用、pymysql模塊(sql注入、增刪改)

Navicat使用mysql

  創建一張表   # 1. 測試+連接數據庫   # 2. 新建庫   # 3. 新建表,新增字段+類型+約束   # 4. 設計表:外鍵   # 5. 新建查詢   # 6. 創建表模型

  # 注意:
    批量加註釋:ctrl+?鍵
    批量去註釋:ctrl+shift+?鍵

  如何導入SQL文件sql

  拷貝如下代碼,新建一個.sql文件,保存到桌面   打開navicat新建數據庫day41,選中新建的數據庫鼠標右鍵選擇運行SQL文件   彈出文件框,選中剛剛保存到桌面的.sql文件便可
   
/* 數據導入: Navicat Premium Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 50624 Source Host : localhost Source Database : sqlexam Target Server Type : MySQL Target Server Version : 50624 File Encoding : utf-8 Date: 10/21/2016 06:46:46 AM */ SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ----------------------------
--  Table structure for `class` -- ---------------------------- DROP TABLE IF EXISTS `class`; CREATE TABLE `class` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `caption` varchar(32) NOT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ----------------------------
--  Records of `class` -- ---------------------------- BEGIN; INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班'); COMMIT; -- ----------------------------
--  Table structure for `course` -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `cname` varchar(32) NOT NULL, `teacher_id` int(11) NOT NULL, PRIMARY KEY (`cid`), KEY `fk_course_teacher` (`teacher_id`), CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of `course` -- ---------------------------- BEGIN; INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '體育', '3'), ('4', '美術', '2'); COMMIT; -- ----------------------------
--  Table structure for `score` -- ---------------------------- DROP TABLE IF EXISTS `score`; CREATE TABLE `score` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `student_id` int(11) NOT NULL, `course_id` int(11) NOT NULL, `num` int(11) NOT NULL, PRIMARY KEY (`sid`), KEY `fk_score_student` (`student_id`), KEY `fk_score_course` (`course_id`), CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`), CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of `score` -- ---------------------------- BEGIN; INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87'); COMMIT; -- ----------------------------
--  Table structure for `student` -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `gender` char(1) NOT NULL, `class_id` int(11) NOT NULL, `sname` varchar(32) NOT NULL, PRIMARY KEY (`sid`), KEY `fk_class` (`class_id`), CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of `student` -- ---------------------------- BEGIN; INSERT INTO `student` VALUES ('1', '', '1', '理解'), ('2', '', '1', '鋼蛋'), ('3', '', '1', '張三'), ('4', '', '1', '張一'), ('5', '', '1', '張二'), ('6', '', '1', '張四'), ('7', '', '2', '鐵錘'), ('8', '', '2', '李三'), ('9', '', '2', '李一'), ('10', '', '2', '李二'), ('11', '', '2', '李四'), ('12', '', '3', '如花'), ('13', '', '3', '劉三'), ('14', '', '3', '劉一'), ('15', '', '3', '劉二'), ('16', '', '3', '劉四'); COMMIT; -- ----------------------------
--  Table structure for `teacher` -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `tid` int(11) NOT NULL AUTO_INCREMENT, `tname` varchar(32) NOT NULL, PRIMARY KEY (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of `teacher` -- ---------------------------- BEGIN; INSERT INTO `teacher` VALUES ('1', '張磊老師'), ('2', '李平老師'), ('3', '劉海燕老師'), ('4', '朱雲海老師'), ('5', '李傑老師'); COMMIT; SET FOREIGN_KEY_CHECKS = 1; ​​
示例代碼

SQL練習題數據庫

  1、查詢全部的課程的名稱以及對應的任課老師姓名   4、查詢平均成績大於八十分的同窗的姓名和平均成績   7、 查詢沒有報李平老師課的學生姓名   8、 查詢沒有同時選修物理課程和體育課程的學生姓名   九、 查詢掛科超過兩門(包括兩門)的學生姓名和班級
   
# 參考答案 #一、查詢全部的課程的名稱以及對應的任課老師姓名
SELECT course.cname, teacher.tname FROM course INNER JOIN teacher ON course.teacher_id = teacher.tid; ​ #四、查詢平均成績大於八十分的同窗的姓名和平均成績
SELECT student.sname, t1.avg_num FROM student INNER JOIN ( SELECT student_id, avg(num) AS avg_num FROM score GROUP BY student_id HAVING avg(num) > 80 ) AS t1 ON student.sid = t1.student_id; ​ #七、 查詢沒有報李平老師課的學生姓名(找出報名李平老師課程的學生,而後取反就能夠)
SELECT student.sname FROM student WHERE sid NOT IN ( SELECT DISTINCT student_id FROM score WHERE course_id IN ( SELECT course.cid FROM course INNER JOIN teacher ON course.teacher_id = teacher.tid WHERE teacher.tname = '李平老師' ) ); ​ #八、 查詢沒有同時選修物理課程和體育課程的學生姓名(沒有同時選修指的是選修了一門的,
思路是獲得物理+體育課程的學生信息表,而後基於學生分組,統計count(課程)=1) SELECT student.sname FROM student WHERE sid IN ( SELECT student_id FROM score WHERE course_id IN ( SELECT cid FROM course WHERE cname = '物理' OR cname = '體育' ) GROUP BY student_id HAVING COUNT(course_id) = 1 ); ​ # 九、 查詢掛科超過兩門(包括兩門)的學生姓名和班級
select student.sname,class.caption from class INNER JOIN student on class.cid = student.class_id WHERE student.sid in (select student_id from score where num < 60 GROUP BY student_id HAVING COUNT(course_id) >=2) ;
參考答案

pymysql模塊 ide

  一、安裝pymysql模塊測試

  terminal下執行:   pip3 install pymysql

  二、代碼鏈接fetch

  
import pymysql # 連接
conn=pymysql.connect( host='localhost', user='root', password='123', database='egon', charset='utf8') # 遊標
cursor=conn.cursor() # 執行完畢返回的結果集默認以元組顯示 #cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 以字典的方式顯示數據
View Code

  三、pymysql操做數據庫spa

  
# 執行sql語句
user = input(">>>:").strip() pwd = input(">>>:").strip() sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) # 注意%s須要加引號
 rows=cursor.execute(sql) # 執行sql語句,返回sql查詢成功的記錄數目 # 獲取真實數據cursor.fetchone(),cursor.fetchall(),cursor.fetchmany(), # 相似管道取值,獲取一條,全部,多條
 cursor.scroll(1,'relative')  # 相對移動
cursor.scroll(3,'absolute')  # 絕對移動
cursor.close() conn.close()
View Code

SQL注入問題設計

username = input(">>>:").strip() password = input(">>>:").strip() sql = "select * from user where username='%s' and password='%s'"%(username,password) # 不要手動去拼接查詢的sql語句,要經過excute去傳參
​​ # 用戶名正確的狀況
username >>>: jason' -- jjsakfjjdkjjkjs
# 用戶名密碼都不對的狀況
username >>>: xxx' or 1=1 --asdjkdklqwjdjkjasdljad
password >>>: '' 如何解決注入問題: 經過cursor.excute​(sql,('jason', '123'))​作處理​

經過pymysql模塊增刪改查 MySQLcode

#
sql = "insert into user(username,password) values(%s,%s)" rows = cursor.excute(sql,('jason','123')) ​ # 一次插入多行記錄
res = cursor,excutemany(sql,[(),(),()] ​​ # 修改
sql = "update user set username='jasonDSB' where id=1" rows = cursor.excute(sql) """ 增和改單單執行excute並不會真正影響到數據,
須要再執行conn.commit()才能夠完成真正的增改
"""# 刪​ sql = ​"delete name from user shere id = 1" rows = cursor.excute(sql)​
相關文章
相關標籤/搜索