1. 程式人生 > >python3基礎:操作mysql資料庫

python3基礎:操作mysql資料庫

mysql登陸

基本操作:
登陸:mysql -uroot -h127.0.0.1 -P3306 -p
mysql -uroot -p(本機不用寫host)
退出mysql:ctrl+z+回車,或者exit
埠號預設是3306,但是可以通過安裝目錄下的配置檔案修改。

使用流程

  • 引用API模組
  • 獲取與資料庫的連線
  • 執行sql語句與儲存過程
  • 關閉資料庫連線

安裝pymysql

python3 與MySQL 進行互動程式設計需要安裝 pymysql 庫,故首先使用如下命令安裝pymysql
–>pip install pymysql
如果電腦中py2和py3共存的話,安裝失敗時請參考之前的部落格

安裝方法

pymysql.connect()連線資料庫函式

程式碼示例:

import pymysql
#開啟資料庫連線
conn = pymysql.connect('localhost',user = "root",passwd = "123456",db = "testdb")
print (conn)
print (type(conn))

在這裡插入圖片描述

conn.cursor():獲取遊標

要想操作資料庫,光連線資料是不夠的,必須拿到操作資料庫的遊標,才能進行後續的操作,比如讀取資料、新增資料。通過獲取到的資料庫連線例項conn下的cursor()方法來建立遊標。遊標用來接收返回結果
程式碼示例:

import pymysql
#開啟資料庫連線
conn = pymysql.connect('localhost',user = "root",passwd = "123456",db = "testdb")
#獲取遊標
cursor=conn.cursor()
print(cursor)

在這裡插入圖片描述
說明:cursor返回一個遊標例項物件,其中包含了很多操作資料的方法,比如執行sql語句。

執行sql語句execute和executemany

  • execute(query,args=None)
  • 函式作用:執行單條的sql語句,執行成功後返回受影響的行數
  • 引數說明:
    query
    :要執行的sql語句,字串型別
    args:可選的序列或對映,用於query的引數值。如果args為序列,query中必須使用%s做佔位符;如果args為對映,query中必須使用%(key)s做佔位符
  1. executemany(query,args=None)
  • 函式作用:批量執行sql語句,比如批量插入資料,執行成功後返回受影響的行數
  • 引數說明
    query:要執行的sql語句,字串型別
    args:巢狀的序列或對映,用於query的引數值

注意
1.資料庫效能瓶頸很大一部份就在於網路IO和磁碟IO,將多個sql語句放在一起,只執行一次IO,可以有效的提升資料庫效能。推薦此方法
2.用executemany()方法一次性批量執行sql語句,固然很好,但是當資料一次傳入過多到server端,可能造成server端的buffer溢位,也可能產生一些意想不到的麻煩。所以,合理、分批次使用executemany是個合理的辦法

建立資料庫

程式碼示例:

'''建立資料庫'''
import pymysql
#開啟資料庫連線,不需要指定資料庫,因為需要建立資料庫
conn = pymysql.connect('localhost',user = "root",passwd = "123456")
#獲取遊標
cursor=conn.cursor()
#建立pythonBD資料庫
cursor.execute('CREATE DATABASE IF NOT EXISTS pythonDB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;')
cursor.close()#先關閉遊標
conn.close()#再關閉資料庫連線
print('建立pythonBD資料庫成功')

在這裡插入圖片描述

建立表

程式碼示例:

import pymysql
#開啟資料庫連線
conn = pymysql.connect('localhost',user = "root",passwd = "123456",db = "testdb")
#獲取遊標
cursor=conn.cursor()
print(cursor)

#建立user表
cursor.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
	  `id` int(11) NOT NULL AUTO_INCREMENT,
	  `name` varchar(255) NOT NULL,
	  `age` int(11) NOT NULL,
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""

cursor.execute(sql)
cursor.close()#先關閉遊標
conn.close()#再關閉資料庫連線
print('建立資料表成功')

插入單條資料

程式碼示例:

'''插入單條資料'''
import pymysql
#開啟資料庫連線,不指定資料庫
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')

cur=conn.cursor()#獲取遊標

#建立user表
cur.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
	  `id` int(11) NOT NULL AUTO_INCREMENT,
	  `name` varchar(255) NOT NULL,
	  `age` int(11) NOT NULL,
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""

cur.execute(sql)

insert=cur.execute("insert into user values(1,'tom',18)")
print('新增語句受影響的行數:',insert)

#另一種插入資料的方式,通過字串傳入值
sql="insert into user values(%s,%s,%s)"
cur.execute(sql,(3,'kongsh',20))

cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述

批量插入多條資料

程式碼示例:

'''插入多條資料'''
import pymysql
#開啟資料庫連線,不指定資料庫
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#獲取遊標
cur=conn.cursor()

#另一種插入資料的方式,通過字串傳入值
sql="insert into user values(%s,%s,%s)"
insert=cur.executemany(sql,[(4,'wen',20),(5,'tom',10),(6,'test',30)])
print ('批量插入返回受影響的行數:',insert)
cur.close()
conn.commit()
conn.close()
print('sql執行成功')

注意:批量插入多條sql語句採用的是executemany(sql,args)函式,返回受影響的行數。args引數是一個包含多個元組的列表,每個元組對應一條mysql中的一條資料。這裡的%s不需要加引號,否則插入資料的資料會型別錯誤

查詢資料

使用execute()函式得到的只是受影響的行數,並不能真正拿到查詢的內容。cursor物件還提供了3種提取資料的方法:fetchone、fetchmany、fetchall.。每個方法都會導致遊標動,所以必須注意遊標的位置。
cursor.fetchone():獲取遊標所在處的一行資料,返回元組,沒有返回None
cursor.fetchmany(size):接受size行返回結果行。如果size大於返回的結果行的數量,則會返回cursor.arraysize條資料。
cursor. fetchall():接收全部的返回結果行。

程式碼示例:fetchone

'''fetchone'''
import pymysql
#開啟資料庫連線
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#獲取遊標
cur=conn.cursor()

cur.execute("select * from user;")
while 1:
    res=cur.fetchone()
    if res is None:
        #表示已經取完結果集
        break
    print (res)
cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述

注意:從execute()函式的查詢結果中取資料,以元組的形式返回遊標所在處的一條資料,如果遊標所在處沒有資料,將返回空元組,該資料執行一次,遊標向下移動一個位置。fetchone()函式必須跟exceute()函式結合使用,並且在exceute()函式之後使用

程式碼示例:fetchmany
‘’‘fetchmany’’’
import pymysql
#開啟資料庫連線
conn=pymysql.connect(‘localhost’,‘root’,‘123456’)
conn.select_db(‘pythondb’)
#獲取遊標
cur=conn.cursor()

cur.execute(“select * from user”)
#取3條資料
resTuple=cur.fetchmany(3)
print(type(resTuple))
for res in resTuple:
print (res)

cur.close()
conn.commit()
conn.close()
print(‘sql執行成功’)
在這裡插入圖片描述
注意:從exceute()函式結果中獲取遊標所在處的size條資料,並以元組的形式返回,元組的每一個元素都也是一個由一行資料組成的元組,如果size大於有效的結果行數,將會返回cursor.arraysize條資料,但如果遊標所在處沒有資料,將返回空元組。查詢幾條資料,遊標將會向下移動幾個位置。fetmany()函式必須跟exceute()函式結合使用,並且在exceute()函式之後使用

程式碼示例:fetchall
‘’‘fetchall’’’
import pymysql
#開啟資料庫連線
conn=pymysql.connect(‘localhost’,‘root’,‘123456’)
conn.select_db(‘pythondb’)
#獲取遊標
cur=conn.cursor()

cur.execute(“select * from user”)
#取所有資料
resTuple=cur.fetchall()
print(type(resTuple))
print (‘共%d條資料’%len(resTuple))

cur.close()
conn.commit()
conn.close()
print(‘sql執行成功’)
在這裡插入圖片描述

注意:獲取遊標所在處開始及以下所有的資料,並以元組的形式返回,元組的每一個元素都也是一個由一行資料組成的元組,如果遊標所在處沒有資料,將返回空元組。執行完這個方法後,遊標將移動到資料庫表的最後

更新資料

程式碼示例:更新單條資料

'''更新單條資料'''
import pymysql
#開啟資料庫連線
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#獲取遊標
cur=conn.cursor()

#更新一條資料
update=cur.execute("update user set age=100 where name='kongsh'")
print ('修改後受影響的行數為:',update)
#查詢一條資料
cur.execute(select * from user where name="kongsh";')
print(cur.fetchone())
cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述
程式碼示例:更新多條資料

'''更新多條資料'''
import pymysql
#開啟資料庫連線
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#獲取遊標
cur=conn.cursor()

#更新前查詢所有資料
cur.execute("select * from user where name in ('kongsh','wen');")
print('更新前的資料為:')
for res in cur.fetchall():
      print (res)

print ('*'*40)      
#更新2條資料
sql="update user set age=%s where name=%s"
update=cur.executemany(sql,[(15,'kongsh'),(18,'wen')])

#更新2條資料後查詢所有資料
cur.execute("select * from user where name in ('kongsh','wen');")
print('更新後的資料為:')
for res in cur.fetchall():
      print (res)


cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述

刪除資料

程式碼示例:刪除單條資料

'''刪除單條資料'''
import pymysql
#開啟資料庫連線
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#獲取遊標
cur=conn.cursor()

#刪除前查詢所有資料
cur.execute("select * from user;")
print('刪除前的資料為:')
for res in cur.fetchall():
      print (res)

print ('*'*40)      
#刪除1條資料
cur.execute("delete from user where id=1")

#刪除後查詢所有資料
cur.execute("select * from user;")
print('刪除後的資料為:')
for res in cur.fetchall():
      print (res)
cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述
程式碼示例:刪除多條資料

'''刪除多條資料'''
import pymysql
#開啟資料庫連線
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#獲取遊標
cur=conn.cursor()

#刪除前查詢所有資料
cur.execute("select * from user;")
print('刪除前的資料為:')
for res in cur.fetchall():
      print (res)

print ('*'*40)      
#刪除2條資料
sql="delete from user where id=%s"
cur.executemany(sql,[(3),(4)])

#刪除後查詢所有資料
cur.execute("select * from user;")
print('刪除後的資料為:')
for res in cur.fetchall():
      print (res)
cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述

事務回滾

程式碼示例:’’‘事務回滾’’'

import pymysql
#開啟資料庫連線
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#獲取遊標
cur=conn.cursor()

#修改前查詢所有資料
cur.execute("select * from user;")
print('修改前的資料為:')
for res in cur.fetchall():
      print (res)

print ('*'*40)      
#更新表中第1條資料
cur.execute("update user set name='xiaoxiaoxiaoxiaoren' where id=5")

#修改後查詢所有資料
cur.execute("select * from user;")
print('修改後的資料為:')
for res in cur.fetchall():
      print (res)
print ('*'*40)
#回滾事務
conn.rollback()
cur.execute("select * from user;")
print('回滾事務後的資料為:')
for res in cur.fetchall():
      print (res)

cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述

練習:插入100條資料到資料庫

程式碼示例:每次插入一條

'''插入100條資料到資料庫(每次插入一條)'''
import pymysql
import string,random
#開啟資料庫連線
conn=pymysql.connect('localhost','root','123456')
conn.select_db('testdb')
#獲取遊標
cur=conn.cursor()

#建立user表
cur.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
	  `id` int(11) NOT NULL AUTO_INCREMENT,
	  `name` varchar(255) NOT NULL,
	  `age` int(11) NOT NULL,
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""

cur.execute(sql)

#修改前查詢所有資料
cur.execute("select * from user;")
print('修改前的資料為:')
for res in cur.fetchall():
      print (res)

print ('*'*40)      
#迴圈插入資料
words=list(string.ascii_letters)
sql="insert into user values(%s,%s,%s)"
for i in range(100):
      random.shuffle(words)#打亂順序
      cur.execute(sql,(i+1,"".join(words[:5]),random.randint(0,80)))

#插入100條後查詢所有資料
cur.execute("select * from user;")
print('修改後的資料為:')
for res in cur.fetchall():
      print (res)
print ('*'*40)

cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述
程式碼示例:一次插入多條

'''插入100條資料到資料庫(一次插入多條)'''
import pymysql
import string,random
#開啟資料庫連線
conn=pymysql.connect('localhost','root','123456')
conn.select_db('testdb')
#獲取遊標
cur=conn.cursor()

#建立user表
cur.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
	  `id` int(11) NOT NULL AUTO_INCREMENT,
	  `name` varchar(255) NOT NULL,
	  `age` int(11) NOT NULL,
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""

cur.execute(sql)

#修改前查詢所有資料
cur.execute("select * from user;")
print('修改前的資料為:')
for res in cur.fetchall():
      print (res)

print ('*'*40)      
#迴圈插入資料
words=list(string.ascii_letters)
sql="insert into user values(%s,%s,%s)"
random.shuffle(words)#打亂順序
cur.executemany(sql,[(i+1,"".join(words[:5]),random.randint(0,80)) for i in range(100) ])

#插入100條後查詢所有資料
cur.execute("select * from user;")
print('修改後的資料為:')
for res in cur.fetchall():
      print (res)
print ('*'*40)

cur.close()
conn.commit()
conn.close()
print('sql執行成功')

在這裡插入圖片描述