亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

MySQL——python交互

系統(tǒng) 1966 0

與python交互之前我們需要安裝一個MySQL的驅(qū)動模塊Connector,這個驅(qū)動模塊直接在cmd命令行輸入

            pip 
            
              install
            
             mysql.connector
          

安裝是否成功可以接著輸入

            
              python
# 輸入之后,會進(jìn)入python解釋器(前提是python已經(jīng)配置好了環(huán)境變量
# 導(dǎo)入安裝的模塊,沒有報(bào)錯即安裝成功
import mysql.connector
            
          

進(jìn)入自己的編輯器(pycharm)首先連接數(shù)據(jù)庫方式:

  數(shù)據(jù)庫連接

      1、當(dāng)前模塊直接連接

            
              import
            
            
               mysql.connector


            
            
              #
            
            
               連接數(shù)據(jù)庫
            
            
con =
            
               mysql.connector.connect(
    host
            
            =
            
              "
            
            
              127.0.0.1
            
            
              "
            
            
              ,
    port
            
            =3306
            
              ,
    user
            
            =
            
              "
            
            
              root
            
            
              "
            
            ,        
            
              #
            
            
               可以填寫其他用戶,用戶的變量名是user
            
            
    password=
            
              "
            
            
              XXXXXX
            
            
              "
            
            ,       
            
              #
            
            
               這里填寫上面用戶對應(yīng)的密碼
            
            
    database=
            
              "
            
            
              dbname
            
            
              "
            
            
              #
            
            
               需要連接的數(shù)據(jù)庫的名字
            
            
              )
......
......
......

            
            
              #
            
            
               使用完數(shù)據(jù)庫之后,需要關(guān)閉數(shù)據(jù)庫,不要浪費(fèi)資源
            
            
con.close()
          

      2、導(dǎo)入配置文件進(jìn)行連接

            
              #
            
            
               先創(chuàng)建一個配置文件 config.py
            
            
              import
            
            
                mysql.connector

            
            
              #
            
            
               下面是字典類型
            
            
config =
            
               {
    
            
            
              "
            
            
              host
            
            
              "
            
            : 
            
              "
            
            
              127.0.0.1
            
            
              "
            
            
              ,
    
            
            
              "
            
            
              port
            
            
              "
            
            : 3306
            
              ,
    
            
            
              "
            
            
              user
            
            
              "
            
            : 
            
              "
            
            
              root
            
            
              "
            
            
              ,
    
            
            
              "
            
            
              password
            
            
              "
            
            : 
            
              "
            
            
              XXXXXX
            
            
              "
            
            
              ,
    
            
            
              "
            
            
              database
            
            
              "
            
            : 
            
              "
            
            
              dbname
            
            
              "
            
            
              
}


            
            
              #
            
            
              再創(chuàng)建一個文件connect.py
            
            
              import
            
            
                mysql.connector

            
            
              from
            
             config 
            
              import
            
            
               config

            
            
              #
            
            
               使用配置文件連接
            
            
con = mysql.connector.connect(**
            
              config)


            
            
              #
            
            
               關(guān)閉連接
            
            
con.close()
          

  游標(biāo)

      游標(biāo)的作用是執(zhí)行sql語句,或者保存sqi結(jié)果集。常用的方法:

        cursor()創(chuàng)建游標(biāo)(使用連接)
        execute()執(zhí)行sql語句;可以接受兩個參數(shù),形如下面涉及的預(yù)編譯

        executemany()循環(huán)執(zhí)行相同的sql語句第二個參數(shù)必須是一個列表

        fetchall()/fetchone()獲取全部數(shù)據(jù)/一條數(shù)據(jù)

            
              #
            
            
               創(chuàng)建一個游標(biāo)
            
            
cursor =
            
               con.cursor()


            
            
              #
            
            
               假設(shè)有兩個sql語句一個是查詢,一個是執(zhí)行insert語句
            
            
              cursor.execute(sql_select)

            
            
              #
            
            
               這個結(jié)果集是保存在cursor中,你可以通過fetechall()獲取全部數(shù)據(jù)或者fetchone()查詢第一條數(shù)據(jù)
            
            
data =
            
               cursor.fetchall()

            
            
              #
            
            
               得到的數(shù)據(jù)我們可以進(jìn)行業(yè)務(wù)的處理
            
            
              #
            
            
               執(zhí)行創(chuàng)建語句,不會結(jié)果集
            
            
sql = 
            
              "
            
            
              insert into s_region values(%s, %s)
            
            
              "
            
            
              
data 
            
            = [[1,
            
              "
            
            
              sd
            
            
              "
            
            ],[2,
            
              "
            
            
              dfd
            
            
              "
            
            ]]  
            
              #
            
            
               或者里面是元組的形式data = [(1,"sd"),(2,"dfd")]
            
            
cursor.execute(sql, data)
          

?

  防止SQL注入攻擊方式

    為什么存在SQL注入攻擊?輸入一個不與數(shù)據(jù)表格的數(shù)據(jù)匹配也是可以繼續(xù)執(zhí)行的。比如用戶輸入特定的錯誤字符串格式數(shù)據(jù),還是可以通過驗(yàn)證登錄進(jìn)去

            
              import
            
            
               mysql.connector


            
            
              #
            
            
               連接數(shù)據(jù)庫
            
            
              
#
            
            
               1、本模塊創(chuàng)建連接并保存在變量中
            
            
con =
            
               mysql.connector.connect(
    host
            
            =
            
              "
            
            
              127.0.0.1
            
            
              "
            
            
              ,
    port
            
            =3306
            
              ,
    user
            
            =
            
              "
            
            
              root
            
            
              "
            
            
              ,
    password
            
            =
            
              "
            
            
              123456
            
            
              "
            
            
              ,
    database
            
            =
            
              "
            
            
              briup2
            
            
              "
            
            
              
)

            
            
              #
            
            
               2、創(chuàng)建數(shù)據(jù)庫游標(biāo)
            
            
cursor =
            
               con.cursor()

            
            
              #
            
            
               模擬登錄:賬戶:last_name,密碼:first_name
            
            
username = 
            
              "
            
            
              1 or 1=1
            
            
              "
            
            
              
password 
            
            = 
            
              "
            
            
              1 or 1=1
            
            
              "
            
            
              #
            
            
               3、定義一個sql語句
            
            
sql = 
            
              "
            
            
              select count(*) from user_table where user_id=%s and user_psd=%s
            
            
              "
            
            %
            
              (username, password)

            
            
              #
            
            
               4、執(zhí)行sql語句
            
            
              ursor.execute(sql )

            
            
              #
            
            
               5、獲取全部結(jié)果集
            
            
data =
            
               cursor.fetchall()

            
            
              print
            
            (data)      
            
              #
            
            
               總之結(jié)果不為0
            
          

      上述結(jié)果不為0表示后臺可以查到某個結(jié)果集,即用戶是可以登錄進(jìn)入(主頁);如果可以注入攻擊就可以刪掉某個數(shù)據(jù)表的所有數(shù)據(jù),這樣做是很危險(xiǎn)的,所以需要后臺處理得到的數(shù)據(jù)

            id = 
            
              "
            
            
              1 or 1=1
            
            
              "
            
            
              
sql 
            
            = 
            
              "
            
            
              delete from tbname where id=%s
            
            
              "
            
             % (id)
            
              #
            
            
               將訂單表數(shù)據(jù)全部刪除了--欲哭無淚
            
            
delete 
            
              from
            
             tbname where id=1 
            
              or
            
             1=1
          

      防止SQL注入攻擊的三種方式:

        1、通過單引號將獲取的值轉(zhuǎn)換為字符串:format格式

            
              #
            
            
               將上面的sql語句改成下面這一語句,注意大括號兩邊都有引號
            
            
sql = 
            
              "
            
            
              select count(*) from user_table where user_id=’{}‘ and user_psd='{}'
            
            
              "
            
            .format(username, password)
          

        2、通過單引號將獲取的值轉(zhuǎn)換為字符串:字符串格式

            
              #
            
            
               將上面的sql語句改成下面這一語句,注意%s兩邊都有引號
            
            
sql = 
            
              "
            
            
              select count(*) from user_table where user_id=’%s‘ and user_psd='%s'
            
            
              "
            
            %(username, password)
          

        3、通過預(yù)編譯的方式防止SQL注入攻擊(推薦使用)

            
              #
            
            
               將上面的sql語句改成下面這一語句,注意%s兩邊都沒有引號
            
            
sql = 
            
              "
            
            
              select count(*) from user_table where user_id=%s and user_psd=%s
            
            
              "
            
            
              #
            
            
               再將執(zhí)行語句改成下面這條
            
            
cursor.execute(sql, (username, password))
          

  事務(wù)控制

    事務(wù)的產(chǎn)生是因?yàn)閷?shù)據(jù)表操作之后,數(shù)據(jù)庫不會發(fā)生改變,若想發(fā)生改變,就需要事務(wù)三操作

    事務(wù)控制一般有三步操作:

      1、開啟事務(wù):通過連接開啟事務(wù),調(diào)用start_transaction()

      2、提交事務(wù):也是通過連接提交事務(wù),一般都是適用于對數(shù)據(jù)表的增加、刪除、修改等操作,調(diào)用commit()

      3、回滾事務(wù):一般是發(fā)生異常之后才會執(zhí)行的回滾,調(diào)用rollback()

    這三步都應(yīng)該在異常中執(zhí)行

              
                import
              
              
                 mysql.connector


              
              
                #
              
              
                 連接數(shù)據(jù)庫
              
              
                try
              
              
                :
    
              
              
                """
              
              
                
    數(shù)據(jù)庫的連接,數(shù)據(jù)表的增加、刪除、修改操作
    都是需要在異常中處理
    
              
              
                """
              
              
                #
              
              
                 1、本模塊創(chuàng)建連接并保存在變量中
              
              
    con =
              
                 mysql.connector.connect(
        host
              
              =
              
                "
              
              
                127.0.0.1
              
              
                "
              
              
                ,
        port
              
              =3306
              
                ,
        user
              
              =
              
                "
              
              
                root
              
              
                "
              
              
                ,
        password
              
              =
              
                "
              
              
                123456
              
              
                "
              
              
                ,
        database
              
              =
              
                "
              
              
                briup2
              
              
                "
              
              
                
    )
    
              
              
                #
              
              
                 2、創(chuàng)建數(shù)據(jù)庫游標(biāo)
              
              
    cursor =
              
                 con.cursor()

    
              
              
                #
              
              
                 3、開啟事務(wù)
              
              
                    con.start_transaction()

    
              
              
                #
              
              
                 4、執(zhí)行一條update語句
              
              
    sql = 
              
                "
              
              
                update user_table set username='aaa'
              
              
                "
              
              
                #
              
              
                 5、執(zhí)行sql語句
              
              
                    cursor.execute(sql)

    
              
              
                #
              
              
                 6、提交事務(wù)
              
              
                    con.commit()

              
              
                except
              
              
                :
    
              
              
                """
              
              
                
    在發(fā)生異常之前,還需判斷連接是否成功
    發(fā)生異常之后一般都是需要回滾,以免數(shù)據(jù)發(fā)生錯誤
    
              
              
                """
              
              
                if
              
              
                "
              
              
                con
              
              
                "
              
              
                in
              
              
                 dir():
        con.rollback()

              
              
                finally
              
              
                :
    
              
              
                """
              
              
                
    無論異常與否,都要執(zhí)行finally語句
    
              
              
                """
              
              
                
    con.close()
              
            
View Code

  數(shù)據(jù)庫連接池(緩存)

    上述代碼的開頭都會寫創(chuàng)建數(shù)據(jù)庫的連接和最后也會寫數(shù)據(jù)庫的關(guān)閉,如果程序反復(fù)創(chuàng)建和關(guān)閉,是會浪費(fèi)大量的資源。而數(shù)據(jù)庫連接池是在程序運(yùn)行之前就已經(jīng)緩存好了,那么就可以直接獲取連接就行,而且不使用數(shù)據(jù)庫也不用關(guān)閉,緩存機(jī)制會自動回收

              
                #
              
              
                 先創(chuàng)建一個配置文件 config.py
              
              
config =
              
                 {
    
              
              
                "
              
              
                host
              
              
                "
              
              : 
              
                "
              
              
                127.0.0.1
              
              
                "
              
              
                ,
    
              
              
                "
              
              
                port
              
              
                "
              
              : 3306
              
                ,
    
              
              
                "
              
              
                user
              
              
                "
              
              : 
              
                "
              
              
                root
              
              
                "
              
              
                ,
    
              
              
                "
              
              
                password
              
              
                "
              
              : 
              
                "
              
              
                123456
              
              
                "
              
              
                ,
    
              
              
                "
              
              
                database
              
              
                "
              
              : 
              
                "
              
              
                briup2
              
              
                "
              
              
                
}


              
              
                #
              
              
                 在創(chuàng)建一個測試文件 exam.py
              
              
                import
              
              
                 mysql.connector.pooling

              
              
                from
              
               config 
              
                import
              
              
                 config
pool 
              
              =
              
                 mysql.connector.pooling.MySQLConnectionPool(
    
              
              **
              
                config,
    pool_size
              
              =10
              
                
)


              
              
                try
              
              
                :
    
              
              
                #
              
              
                 2、先獲取一個連接
              
              
    con =
              
                 pool.get_connection()
    
              
              
                #
              
              
                 3、開啟事務(wù)
              
              
                    con.start_transaction()
    
              
              
                #
              
              
                 4、創(chuàng)建一個游標(biāo)
              
              
    cursor =
              
                 con.cursor()
    
              
              
                #
              
              
                 5、定義sql語句
              
              
    sql_create = 
              
                "
              
              
                create table s_emp_new like s_emp;
              
              
                "
              
              
                
    sql_insert 
              
              = 
              
                """
              
              
                
        insert into s_emp_new 
        select * 
        from s_emp
        where dept_id in (      
            select dept_id
            from s_emp
            group by dept_id
                having avg(salary)>(    
                    select avg(salary)
                    from s_emp
                )
        )
              
              
                """
              
              
                
    sql_update 
              
              = 
              
                "
              
              
                update s_emp_new set dept_id = 44
              
              
                "
              
              
                #
              
              
                 6、執(zhí)行sql語句
              
              
                    cursor.execute(sql_create)
    cursor.execute(sql_insert)
    cursor.execute(sql_update)
    
              
              
                #
              
              
                 7、提交事務(wù)
              
              
                    con.commit()

    tip 
              
              = 
              
                "
              
              
                執(zhí)行成功!
              
              
                "
              
              
                except
              
              
                 Exception as e:
    
              
              
                if
              
              
                "
              
              
                con
              
              
                "
              
              
                in
              
              
                 dir():
        
              
              
                #
              
              
                 8、回滾事務(wù)
              
              
                        con.rollback()
        tip 
              
              = 
              
                "
              
              
                執(zhí)行失敗!
              
              
                "
              
              
                print
              
              
                (e)

              
              
                finally
              
              
                :
    
              
              
                print
              
              (tip)
            
View Code

?

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩黄色录像 | 全免费午夜一级毛片真人 | 中文字幕在线观看不卡 | a一级日本特黄aaa大片 | 国产在线91精品 | 国产在线精彩视频二区 | 精品免费| 视频一区二区三区在线 | 99pao在线视频精品免费 | 国产亚洲情侣久久精品 | 狠狠色噜噜狠狠狠 | 亚洲美女亚洲精品久久久久 | 欧美日韩一区二区高清免费视频 | 国产精品亚洲一区二区三区正片 | 四虎影视国产精品永久在线 | 亚洲 国产 路线1路线2路线 | 亚洲欧美综合一区二区三区四区 | 99精品全国免费7观看视频 | 天天热天天干 | 国产香蕉国产精品偷在线观看 | 四虎影永久在线观看网址 | 日本一级毛片免费 | 日韩免费高清一级毛片在线 | 亚欧有色亚欧乱色视频 | 91日韩精品天海翼在线观看 | 污影院 | 奇米影视四色狠狠888俺去啦 | 欧美激情欧美狂野欧美精品免费 | 亚洲精品高清久久 | 9久久这里只有精品国产 | 国产精品视频免费播放 | 777奇米影视网| 狠狠色婷婷丁香综合久久韩国 | 亚洲一区综合在线播放 | 欧美一区二区三区在线观看 | 天天射天天爱天天干 | 国产精品香蕉 | 香蕉色香蕉在线视频 | 北条麻妃手机在线观看 | 亚洲精品一区二区三区网址 | 9热这里只有真品 |