資料庫---MySql(二)-pymysql
阿新 • • 發佈:2020-12-14
一、安裝
pip install pymysql
二、使用
1.PythonDB API訪問資料庫流程
2.mysql
2.1 匯入mysql模組
import pymysql
2.2建立連線
使用connect/Connection/Connect這三個建立連線都可以,前兩個是後一個函式的引用
mysql.connect(host,port,user,password,database,charset)
- host:連線的mysql主機,如果是本機就是localhost
- port:連線的主機埠,預設是3306
- user:連線mysql的使用者名稱
- password:連線mysql的密碼
- database:連線的資料庫名稱
- charset:連線使用的編碼方式,建議使用utf8
connect = pymysql.connect('localhost','root','','db1')
2.3獲取Cursor物件
通過連接獲取遊標, cursor = connect.cursor()返回Cursor物件,用於執行sql語句並獲得結果
cursor = connect.cursor() #後面用fetch獲取的結果是元組裡面套元組 cursor = connect.cursor(cursor = pymysql.cursors.DictCursor) #後面用fetch獲取的結果是列表裡面套字典
2.4操作資料庫
2.4.1使用遊標執行SQL語句
cursor.execute(operation , [parameters]),返回受影響的條數(int)
sql = "select * from t1" cursor.execute(sql)
如果需要上傳引數,不要在SQL語句後拼接字串,防止SQL注入;
sql = "select * from userinfo where name = %s password=%s" %('"" or 1=1 --',"") #user是空,or 1=1必然成立,--表示註釋,後面部分被註釋;userinfo表中並沒有user是空的資料;SQL注入c= cursor.execute(sql) if c: print("success") #結果會列印success data = cursor.fetchall() print(data) #列印userinfo表裡的所有資料
需要上傳引數,在execute後面傳入引數,可以是列表、元組、字典
sql= "insert into userinfo (name,password) values (%s,%s)" cursor.execute(sql,["小王","123456"]) #傳入一條資料 curaor.executemany(sql,(["小張","123456"],["小劉","123456"])) #傳入多條資料 connect.commit() #如果是修改表的必須要提交 #傳入字典 sql= "insert into userinfo (name,password) values (%(u)s,%(p)s)" cursor.execute(sql,{"u":"小明","p":"123456"}) #傳入一條資料 connect.commit()
2.4.2提交資料、撤銷資料
connect.commit():提交資料;如果修改了資料庫必須提交資料
connect.rollback():撤銷資料;在執行增刪改操作時,如果不想提交前面的修改操作,可以使用 rollback 回滾取消操作
2.4.3獲取資料
fetch獲取查詢結果資料,返回一個元組巢狀元組;如果獲取cursor時設定了connect.cursor(cursor = pymysql.cursors.DictCursor),返回一個列表裡面巢狀字典;
因為在獲取資料時,遊標是移動的,所以前面取過的資料,後面不會再取了
curser.fetchone():獲取一條資料
curser.fetchmany(4):獲取4條資料,條數可修改
cursor.fetchall():獲取查詢結果的所有資料;如果遊標不在開頭,就不能獲取到所有資料
cursor.scroll(2,mode="relative"):相對位移;在當前位置移動2位,fetch取當前位置後面的第3位資料;數字可變 cursor.scroll(2,mode="absolute"):絕對位移;移動2位,fetch始終取第3位的資料;數字可變 cursor.lastrowid:獲取插入資料的最後一條的自增id cursor.description:方法會將每個欄位的欄位名,欄位型別,欄位長度...等等欄位的屬性列出來2.5關閉cursor
cursor.close()
2.6關閉連線
connect.close()
三、練習
1.建立表
importpymysqlconnect=pymysql.connect('localhost','root','','db1') cur=connect.cursor() #cur=connect.cursor(cursor=pymysql.cursors.DictCursor) #建立表 sql="""createtableuserinfo( idintunsignednotnullauto_incrementprimarykey, namechar(10)notnull, passwordchar(10)notnull )engine=innodbdefaultcharset=utf8;""" try: cur.execute(sql) connect.commit()#提交 exceptExceptionase: print("錯誤資訊:%s"%e) connect.rollback()#回滾
#顯示錶 sql_s="showtables;" cur.execute(sql_s) data=cur.fetchall() print(data) cur.close() connect.close()
2.插入資料和查詢
import pymysql import pandas connect = pymysql.connect("localhost","root","","db1") cur = connect.cursor() sql_i = "insert into userinfo (name, password) values (%s, %s)" try: cur.executemany(sql_i,(('小明','123456'), ('小紅','123456'), ('小張','123456'), ('小王','123456'), ('小小明','123456'), ('Lucy','123456'))) connect.commit() except Exception as e: print("錯誤原因:%s" %str(e)) connect.rollback() sql_s = "select * from userinfo" cur.execute(sql_s) data = cur.fetchall() print(cur.description) header = [t[0] for t in cur.description] df = pandas.DataFrame(list(data),columns = header) print(df)
四、簡單封裝
import pymysql import pandas class MyPymysql: def __init__(self,*args): self.connect = pymysql.connect(*args) self.cur = self.connect.cursor() def use(self,db): """切換資料庫""" sql = "use %s;" self.cur.execute(sql,db) def create_db(self,db): """建立資料庫""" sql = "create database %s;" try: self.cur.execute(sql,db) self.connect.commit() except Exception as e: print("錯誤資訊:%s" %e) self.connect.rollback() def show_db(self): """顯示資料庫""" sql = "show databases;" self.cur.execute(sql) def create_table(self,sql): """建立資料表""" try: self.cur.execute(sql) self.connect.commit() except Exception as e: print("錯誤資訊:%s" %e) self.connect.rollback() def show_t(self): """顯示錶""" sql = "show tables;" self.cur.execute(sql) def insert(self,sql): """插入資料""" try: self.cur.execute(sql) self.connect.commit() except Exception as e: print("錯誤原因:%s" %e) self.connect.rollback() def select(self,sql): """查詢表顯示所有結果""" try: self.cur.execute(sql) data = self.cur.fetchall() header = [t[0] for t in self.cur.description] df = pandas.DataFrame(list(data),columns = header) except Exception as e: print("錯誤原因:%s" %e) return df def change(self,sql): """修改表""" try: self.cur.execute(sql) except Exception as e: print("錯誤原因:%s" %e) if __name__ == "__main__": my = MyPymysql("localhost","root","","db1") sql_u = "update userinfo set password = '098765';" my.change(sql_u) sql = "select * from userinfo limit 3;" data = my.select(sql) print(data)