1. 程式人生 > 實用技巧 >資料庫---MySql(二)-pymysql

資料庫---MySql(二)-pymysql

一、安裝

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.建立表



importpymysql

connect=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)