Navicat工具、pymysql模塊、數據備份

IDE工具介紹(Navicat)

生產環境仍是推薦使用mysql命令行,但爲了方便咱們測試,可使用IDE工具,咱們使用Navicat工具,這個工具本質上就是一個socket客戶端,可視化的鏈接mysql服務端的一個工具,而且他是圖形界面版的。咱們使用它和直接使用命令行的區別就相似linux和windows系統操做起來的一個區別。html

1、安裝和使用

  下載地址:https://pan.baidu.com/s/1bpo5mqjpython

  下載完以後,直接解壓出來就能用,看一下解壓以後的目錄:mysql

  雙擊打開下面這個文件(能夠把它添加一個桌面快捷方式,或者添加到任務欄):linux

  

      而後會提示你輸入註冊碼:sql

      

    回到navicat的解壓出來的文件夾裏面,有個叫作key.txt的文件,打開,裏面有註冊碼數據庫

    

    

    將這個註冊碼copy到輸入註冊碼的地方:windows

    

    點擊肯定就能打開使用了:會顯示出來下面的界面後端

    

    

    既然是mysql客戶端,咱們須要鏈接mysql服務端服務器

    

    在彈出的界面輸入mysql服務端的ip地址和端口,還有mysql用戶名和密碼socket

    

    

    

    

    

    

    

    

     

    

    關於校對規則你們看看這兩篇博客就明白了:

      http://www.javashuo.com/article/p-xdoxxfej-ew.html

      https://www.jb51.net/article/48775.htm

 

     上面的步驟點擊肯定就建好一個數據庫了:

    

    而後咱們到上面的數據庫裏面新建一張表

    

 

     

    

     

    也就是咱們本身用鼠標點啊點之類的,也就是生成對應的sql語句去執行

    而後點擊保存:

    

    這個表就生成了:

    

    不信咱們去命令行看一看:這個表就存在了

    

    之後咱們直接就使用這個工具來操做數據庫就能夠了,由於命令行操做仍是比較噁心的

    而後咱們看看創建外鍵

    

    

    而後自動會生成對應的sql語句

    

    

     

    

    而後點擊保存,起一個表名,就有了這個表了

    

    而後雙擊上面的表名就能夠插入數據了

    

    

    比方說咱們上面這個dep表的id字段沒有設置自增,我想改一下,讓它這個id字段變爲自增的怎麼辦

    設計表:

    

    

    

    那咱們該怎麼辦呢,直接刪除這個表而後從新建立嗎?你另一個關聯表確定不讓你這麼作,因此你須要先將那個關聯表的外鍵關係先取消,或者先將那個外鍵關聯表刪除

    

    而後把這個關聯表的外鍵刪除,而後保存

    而後再去咱們想給id字段加上自增的那個dep表裏面把id字段設置爲自增,保存,而後在從新將emp表外鍵到dep的id字段上

    而後給dep表插入幾條數據

    

    

    這個工具還能將你的表之間的關係經過圖形的形式來給你展現:

    

    

    點擊這個ER圖,二者的關係圖就顯示出來了,那麼未來你的表不少的時候,你就能夠經過這個圖來查看本身表和表之間的關係,看效果:

    

    若是咱們點擊兩個表之間的線,是能夠看到二者之間的關係的:

    

 

    

     還能夠選擇上面的模型來直接創做圖表,建立表之間的關係

    

    

    可是上面咱們創建的這個模型,是不能直接建立到數據庫裏面的,須要將它以sql的形式導入,而後把導出的sql語句,到數據庫裏面去執行

    

    而後導出保存到一個地方

    

    打開咱們導出的文件,看一下里面的內容

    

    你看,就是我們建立的模型翻譯成的sql語句,複製一下這些sql語句,但mysql裏面去執行一下,就等到咱們模型裏面的兩個表了,是否是很方便

    Navicat工具還能寫原生sql語句來進行數據庫的操做

    

    就看到一個輸入sql語句的界面了:

    

    而後寫一個sql語句試一下:

    

    

      而後運行一下:

      

        

      咱們還能夠將以前數據庫中導出來的數據,以sql文件的形式經過navicat導入到數據庫中:看步驟

      假如咱們有一個從數據庫中導入的文件,文件名稱爲init.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文件;

      

      

      

      注意上面這一步,直接關閉就能夠了,不要再次點擊開始了

       

      而後經過ER圖,來看看,各個表的關係就看的很清楚了。

      

      咱們還能夠對sql語句進行註釋:選中語句而後ctrl+/就能多行註釋,ctrl+shift+/ 就能取消註釋

      ok,Navicat簡單的就介紹完了,你們能夠練一練了~~~

 

MySQL數據備份

使用mysqldump實現邏輯備份

#語法:
# mysqldump -h 服務器 -u用戶名 -p密碼 數據庫名 > 備份文件.sql

#示例:
#單庫備份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql

#多庫備份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

#備份全部庫
mysqldump -uroot -p123 --all-databases > all.sql

恢復邏輯備份

#方法一:
[root@localhost backup]# mysql -uroot -p123 < /backup/all.sql

#方法二:
mysql> use db1;
mysql> SET SQL_LOG_BIN=0;
mysql> source /root/db1.sql

#注:若是備份/恢復單個庫時,能夠修改sql文件
DROP database if exists school;
create database school;
use school;

表的導出和導入

SELECT... INTO OUTFILE 導出文本文件
示例:
mysql> SELECT * FROM school.student1
INTO OUTFILE 'student1.txt'
FIELDS TERMINATED BY ',' //定義字段分隔符
OPTIONALLY ENCLOSED BY '' //定義字符串使用什麼符號括起來
LINES TERMINATED BY '\n' ; //定義換行符


mysql 命令導出文本文件
示例:
# mysql -u root -p123 -e 'select * from student1.school' > /tmp/student1.txt
# mysql -u root -p123 --xml -e 'select * from student1.school' > /tmp/student1.xml
# mysql -u root -p123 --html -e 'select * from student1.school' > /tmp/student1.html

LOAD DATA INFILE 導入文本文件
mysql> DELETE FROM student1;
mysql> LOAD DATA INFILE '/tmp/student1.txt'
INTO TABLE school.student1
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY ''
LINES TERMINATED BY '\n';
#可能會報錯
mysql> select * from db1.emp into outfile 'C:\\db1.emp.txt' fields terminated by ',' lines terminated by '\r\n';
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable


#數據庫最關鍵的是數據,一旦數據庫權限泄露,那麼經過上述語句就能夠輕鬆將數據導出到文件中而後下載拿走,於是mysql對此做了限制,只能將文件導出到指定目錄
在配置文件中
[mysqld]
secure_file_priv='C:\\' #只能將數據導出到C:\\下

重啓mysql
從新執行上述語句

數據庫遷移

務必保證在相同版本之間遷移
# mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目標IP -uroot -p456

PyMySQL介紹

PyMySQL 是在 Python3.x 版本中用於鏈接 MySQL 服務器的一個庫,Python2中則使用mysqldb。

Django中也可使用PyMySQL鏈接MySQL數據庫。

PyMySQL安裝

pip install pymysql

鏈接數據庫

在進行本文如下內容以前須要注意:

  • 你有一個MySQL數據庫,而且已經啓動。
  • 你有能夠鏈接該數據庫的用戶名和密碼
  • 你有一個有權限操做的database

基本使用

 

import pymysql
user=input('用戶名: ').strip()
pwd=input('密碼: ').strip()

#連接,指定ip地址和端口,本機上測試時ip地址能夠寫localhost或者本身的ip地址或者127.0.0.1,而後你操做數據庫的時候的用戶名,密碼,要指定你操做的是哪一個數據庫,指定庫名,還要指定字符集。否則會出現亂碼
conn=pymysql.connect(host='localhost',port=3306,user='root',password='123',database='student',charset='utf8') #指定編碼爲utf8的時候,注意沒有-,別寫utf-8,數據庫爲
#獲得conn這個鏈接對象
#遊標
cursor=conn.cursor() #這就想到於mysql自帶的那個客戶端的遊標mysql> 在這後面輸入指令,回車執行
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) #獲取字典數據類型表示的結果:{'sid': 1, 'gender': '', 'class_id': 1, 'sname': '理解'} {'字段名':值}


#而後給遊標輸入sql語句並執行sql語句execute
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s須要加引號,執行這句sql的前提是醫藥有個userinfo表,裏面有name和password兩個字段,還有一些數據,本身添加數據昂
print(sql)
res=cursor.execute(sql) #執行sql語句,返回sql查詢成功的記錄數目,是個數字,是受sql語句影響到的記錄行數,其實除了受影響的記錄的條數以外,這些記錄的數據也都返回了給遊標,這個就至關於咱們subprocess模塊裏面的管道PIPE,乘放着返回的數據
#all_data=cursor.fetchall()  #獲取返回的全部數據,注意凡是取數據,取過的數據就沒有了,結果都是元祖格式的
#many_data=cursor.fetchmany(3) #一下取出3條數據,
#one_data=cursor.fetchone()  #按照數據的順序,一次只拿一個數據,下次再去就從第二個取了,由於第一個被取出去了,取一次就沒有了,結果也都是元祖格式的
  fetchone:(1, '', 1, '理解')
  fetchone:(2, '', 1, '鋼蛋')
  fetchall:((3, '', 1, '張三'), (4, '', 1, '張一'))
#上面fetch的結果都是元祖格式的,無法看出哪一個數據是對應的哪一個字段,這樣是否是不太好看,想想,咱們能夠經過python的哪種數據類型,能把字段和對應的數據表示出來最清晰,固然是字典{'字段名':值}
#咱們能夠再建立遊標的時候,在cursor裏面加上一個參數:cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)獲取的結果就是字典格式的,fetchall或者fetchmany取出的結果是列表套字典的數據形式


上面咱們說,咱們的數據取一次是否是就沒有了啊,實際上不是的,這個取數據的操做就像讀取文件內容同樣,每次read以後,光標就移動到了對應的位置,咱們能夠經過seek來移動光標
一樣,咱們能夠移動遊標的位置,繼續取咱們前面的數據,經過cursor.scroll(數字,模式),第一個參數就是一個int類型的數字,表示日後移動的記錄條數,第二個參數爲移動的模式,有兩個值:absolute:絕對移動,relative:相對移動
#絕對移動:它是相對於全部數據的起始位置開始日後面移動的
#相對移動:他是相對於遊標的當前位置開始日後移動的

#絕對移動的演示
#print(cursor.fetchall())
#cursor.scroll(3,'absolute') #從初始位置日後移動三條,那麼下次取出的數據爲第四條數據
#print(cursor.fetchone())

#相對移動的演示
#print(cursor.fetchone())
#cursor.scroll(1,'relative') #經過上面取了一次數據,遊標的位置在第二條的開頭,我如今相對移動了1個記錄,那麼下次再取,取出的是第三條,我相對於上一條,往下移動了一條
#print(cursor.fetchone())

print(res) #一個數字

cursor.close() #關閉遊標
conn.close()   #關閉鏈接

if res:
    print('登陸成功')
else:
    print('登陸失敗')

 

注意事項

charset=「utf8」,編碼不要寫成"utf-8"

 

3. SQL注入問題
1. 什麼是SQL注入?
用戶輸入的內容有惡意的SQL語句,後端拿到用戶輸入的內容不作檢測直接作字符串拼接,獲得一個和預期不一致的SQL語句
2. 如何解決SQL注入?
對用戶輸入的內容作檢測
pymysql內置了這種檢測,咱們只須要讓pymysql幫咱們拼接sql語句
ret = cursor.execute(sql, [name, pwd]) # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句

好比:

uname = input('請輸入用戶名:')
pword = input('請輸入密碼:')

sql = "select * from userinfo where username='%s' and password='%s';"%(uname,pword)
print(sql)
res = cursor.execute(sql) #res咱們說是獲得的行數,若是這個行數不爲零,說明用戶輸入的用戶名和密碼存在,若是爲0說名存在,你想一想對不

print(res) #若是輸入的用戶名和密碼錯誤,這個結果爲0,若是正確,這個結果爲1
if res:
    print('登錄成功')
else:
    print('用戶名和密碼錯誤!')
#運行看結果:竟然登錄成功
請輸入用戶名:chao' -- xxx
請輸入密碼:
select * from userinfo where username='chao' -- xxx' and password='';
登錄成功

咱們來分析一下:
此時uname這個變量等於什麼,等於chao' -- xxx,而後咱們來看咱們的sql語句被這個字符串替換以後是個什麼樣子:
select * from userinfo where username='chao' -- xxx' and password=''; 其中chao後面的這個',在進行字符串替換的時候,咱們輸入的是chao',這個引號和前面的引號組成了一對,而後後面--在sql語句裏面是註釋的意思,也就是說--後面的sql語句被註釋掉了。也就是說,拿到的sql語句是select * from userinfo where username='chao';而後就去本身的數據庫裏面去執行了,發現可以找到對應的記錄,由於有用戶名爲chao的記錄,而後他就登錄成功了,可是其實他連密碼都不知道,只知道個用戶名。。。,他完美的跳過了你的認證環節。

而後咱們再來看一個例子,直接連用戶名和密碼都不知道,可是依然可以登錄成功的狀況

請輸入用戶名:xxx' or 1=1 -- xxxxxx
請輸入密碼:
select * from userinfo where username='xxx' or 1=1 -- xxxxxx' and password='';
登錄成功

咱們只輸入了一個xxx' 加or 加 1=1 加 -- 加任意字符串
看上面被執行的sql語句你就發現了,or 後面跟了一個永遠爲真的條件,那麼即使是username對不上,可是or後面的條件是成立的,也可以登錄成功。
總結我們剛纔說的兩種sql注入的語句
#一、sql注入之:用戶存在,繞過密碼 chao' -- 任意字符 #二、sql注入之:用戶不存在,繞過用戶與密碼 xxx' or 1=1 -- 任意字符
解決方法總結:
# 原來是咱們對sql進行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)

#改寫爲(execute幫咱們作字符串拼接,咱們無需且必定不能再爲%s加引號了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s須要去掉引號,由於pymysql會自動爲咱們加上
res=cursor.execute(sql,[user,pwd]) #pymysql模塊自動幫咱們解決sql注入的問題,只要咱們按照pymysql的規矩來。

增刪改查操做

import pymysql


# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect(
    host='192.168.16.94',
    port=3306,
    user='bbn',
    # password='123',
    database='day43',
    charset='utf8'
)
# 2. 獲取光標
cursor = conn.cursor()
# 3. 執行SQL語句
# 3.1 獲得SQL語句
sql = "insert into userinfo(username, password) values (%s,%s);"  # 按照pymysql模塊的寫法定義好佔位符
# 3.2 使用光標對象執行SQL語句
ret = cursor.execute(sql, ['Eva_J', '456'])  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句
# 涉及操做數據庫的 必定要提交
conn.commit()
# 關閉
cursor.close()
conn.close()

批量執行

# 導入pymysql模塊
import pymysql
# 鏈接database
conn = pymysql.connect(host=「你的數據庫地址」, user=「用戶名」,password=「密碼」,database=「數據庫名」,charset=「utf8」)
# 獲得一個能夠執行SQL語句的光標對象
cursor = conn.cursor()
sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)]
try:
    # 批量執行多條插入SQL語句
    cursor.executemany(sql, data)
    # 提交事務
    conn.commit()
except Exception as e:
    # 有異常,回滾事務
    conn.rollback()
cursor.close()
conn.close()

 

import pymysql


# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect(
    host='192.168.16.94',
    port=3306,
    user='bbn',
    # password='123',
    database='day43',
    charset='utf8'
)
# 2. 獲取光標
cursor = conn.cursor()
# 3. 執行SQL語句
# 3.1 獲得SQL語句
sql = "delete from userinfo where username=%s;"  # 按照pymysql模塊的寫法定義好佔位符
# 3.2 使用光標對象執行SQL語句
ret = cursor.execute(sql, ['alex'])  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句
# 涉及操做數據庫的 必定要提交
conn.commit()
# 關閉
cursor.close()
conn.close()

import pymysql


# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect(
    host='192.168.16.94',
    port=3306,
    user='bbn',
    # password='123',
    database='day43',
    charset='utf8'
)
# 2. 獲取光標
cursor = conn.cursor()
# 3. 執行SQL語句
# 3.1 獲得SQL語句
sql = "update userinfo set password=%s where username=%s;"  # 按照pymysql模塊的寫法定義好佔位符
# 3.2 使用光標對象執行SQL語句
ret = cursor.execute(sql, ['789', 'gold'])  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句
# 涉及操做數據庫的 必定要提交
conn.commit()
# 關閉
cursor.close()
conn.close()

取剛纔插入到數據庫的id值,插入數據失敗回滾

# 導入pymysql模塊
import pymysql
# 鏈接database
conn = pymysql.connect(host=「你的數據庫地址」, user=「用戶名」,password=「密碼」,database=「數據庫名」,charset=「utf8」)
# 獲得一個能夠執行SQL語句的光標對象
cursor = conn.cursor()
sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
username = "Alex"
age = 18
try:
    # 執行SQL語句
    cursor.execute(sql, [username, age])
    # 提交事務
    conn.commit()
    # 提交以後,獲取剛插入的數據的ID
    last_id = cursor.lastrowid
except Exception as e:
    # 有異常,回滾事務
    conn.rollback()
cursor.close()
conn.close()
相關文章
相關標籤/搜索