Python 中操作 MySQL

引入模塊

  • 在py文件中引入pymysql模塊
from pymysql import *

Connection 對象

  • 用于建立與數(shù)據(jù)庫的連接

  • 創(chuàng)建對象:調(diào)用connect()方法

conn=connect(參數(shù)列表)

  • 參數(shù)host:連接的mysql主機,如果本機是'localhost'
  • 參數(shù)port:連接的mysql主機的端口胜宇,默認(rèn)是3306
  • 參數(shù)database:數(shù)據(jù)庫的名稱
  • 參數(shù)user:連接的用戶名
  • 參數(shù)password:連接的密碼
  • 參數(shù)charset:通信采用的編碼方式酷师,推薦使用utf8

對象的方法

  • close()關(guān)閉連接
  • commit()提交
  • cursor()返回Cursor對象,用于執(zhí)行sql語句并獲得結(jié)果

Cursor對象

  • 用于執(zhí)行sql語句冗澈,使用頻度最高的語句為select、insert、update址愿、delete
  • 獲取Cursor對象:調(diào)用Connection對象的cursor()方法
cs1=conn.cursor()

對象的方法

  • close()關(guān)閉
  • execute(operation [, parameters ])執(zhí)行語句,返回受影響的行數(shù)冻璃,主要用于執(zhí)行insert响谓、update、delete語句省艳,也可以執(zhí)行create娘纷、alter、drop等語句
  • fetchone()執(zhí)行查詢語句時跋炕,獲取查詢結(jié)果集的第一個行數(shù)據(jù)赖晶,返回一個元組
  • fetchall()執(zhí)行查詢時,獲取結(jié)果集的所有行辐烂,一行構(gòu)成一個元組遏插,再將這些元組裝入一個元組返回

對象的屬性

  • rowcount只讀屬性,表示最近一次execute()執(zhí)行后受影響的行數(shù)
  • connection獲得當(dāng)前連接對象

增刪改

from pymysql import *

def main():
    # 創(chuàng)建Connection連接
    conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
    # 獲得Cursor對象
    cs1 = conn.cursor()
    # 執(zhí)行insert語句纠修,并返回受影響的行數(shù):添加一條數(shù)據(jù)
    # 增加
    count = cs1.execute('insert into goods_cates(name) values("硬盤")')
    #打印受影響的行數(shù)
    print(count)

    count = cs1.execute('insert into goods_cates(name) values("光盤")')
    print(count)

    # # 更新
    # count = cs1.execute('update goods_cates set name="機械硬盤" where name="硬盤"')
    # # 刪除
    # count = cs1.execute('delete from goods_cates where id=6')

    # 提交之前的操作胳嘲,如果之前已經(jīng)之執(zhí)行過多次的execute,那么就都進(jìn)行提交
    conn.commit()

    # 關(guān)閉Cursor對象
    cs1.close()
    # 關(guān)閉Connection對象
    conn.close()

if __name__ == '__main__':
    main()

查詢一行數(shù)據(jù)

from pymysql import *

def main():
    # 創(chuàng)建Connection連接
    conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
    # 獲得Cursor對象
    cs1 = conn.cursor()
    # 執(zhí)行select語句扣草,并返回受影響的行數(shù):查詢一條數(shù)據(jù)
    count = cs1.execute('select id,name from goods where id>=4')
    # 打印受影響的行數(shù)
    print("查詢到%d條數(shù)據(jù):" % count)

    for i in range(count):
        # 獲取查詢的結(jié)果
        result = cs1.fetchone()
        # 打印查詢的結(jié)果
        print(result)
        # 獲取查詢的結(jié)果

    # 關(guān)閉Cursor對象
    cs1.close()
    conn.close()

if __name__ == '__main__':
    main()

查詢多行數(shù)據(jù)

from pymysql import *

def main():
    # 創(chuàng)建Connection連接
    conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
    # 獲得Cursor對象
    cs1 = conn.cursor()
    # 執(zhí)行select語句了牛,并返回受影響的行數(shù):查詢一條數(shù)據(jù)
    count = cs1.execute('select id,name from goods where id>=4')
    # 打印受影響的行數(shù)
    print("查詢到%d條數(shù)據(jù):" % count)

    result = cs1.fetchall()
    print(result)

    # 關(guān)閉Cursor對象
    cs1.close()
    conn.close()

if __name__ == '__main__':
    main()

參數(shù)化 (防止sql注入)

  • sql語句的參數(shù)化颜屠,可以有效防止sql注入
  • 注意:此處不同于python的字符串格式化,全部使用%s占位

from pymysql import *

def main():

    find_name = input("請輸入物品名稱:")

    # 創(chuàng)建Connection連接
    conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
    # 獲得Cursor對象
    cs1 = conn.cursor()

    # # 非安全的方式
    # # 輸入 " or 1=1 or "   (雙引號也要輸入)
    # sql = 'select * from goods where name="%s"' % find_name
    # print("""sql===>%s<====""" % sql)
    # # 執(zhí)行select語句白魂,并返回受影響的行數(shù):查詢所有數(shù)據(jù)
    # count = cs1.execute(sql)

    # 安全的方式
    # 構(gòu)造參數(shù)列表
    params = [find_name]
    # 執(zhí)行select語句汽纤,并返回受影響的行數(shù):查詢所有數(shù)據(jù)
    count = cs1.execute('select * from goods where name=%s', params)
    # 注意:
    # 如果要是有多個參數(shù),需要進(jìn)行參數(shù)化
    # 那么params = [數(shù)值1, 數(shù)值2....]福荸,此時sql語句中有多個%s即可 

    # 打印受影響的行數(shù)
    print(count)
    # 獲取查詢的結(jié)果
    # result = cs1.fetchone()
    result = cs1.fetchall()
    # 打印查詢的結(jié)果
    print(result)
    # 關(guān)閉Cursor對象
    cs1.close()
    # 關(guān)閉Connection對象
    conn.close()

if __name__ == '__main__':
    main()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蕴坪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敬锐,更是在濱河造成了極大的恐慌背传,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件台夺,死亡現(xiàn)場離奇詭異径玖,居然都是意外死亡,警方通過查閱死者的電腦和手機颤介,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門梳星,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滚朵,你說我怎么就攤上這事冤灾。” “怎么了辕近?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵韵吨,是天一觀的道長。 經(jīng)常有香客問我移宅,道長归粉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任漏峰,我火速辦了婚禮糠悼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芽狗。我一直安慰自己绢掰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布童擎。 她就那樣靜靜地躺著滴劲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顾复。 梳的紋絲不亂的頭發(fā)上班挖,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音芯砸,去河邊找鬼萧芙。 笑死给梅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的双揪。 我是一名探鬼主播动羽,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼凡怎,長吁一口氣:“原來是場噩夢啊……” “哼纱意!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兄春,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤疯趟,失蹤者是張志新(化名)和其女友劉穎拘哨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體信峻,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡倦青,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盹舞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片产镐。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖踢步,靈堂內(nèi)的尸體忽然破棺而出磷账,到底是詐尸還是另有隱情,我是刑警寧澤贾虽,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站吼鱼,受9級特大地震影響蓬豁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菇肃,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一地粪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琐谤,春花似錦蟆技、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至织阳,卻和暖如春眶蕉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唧躲。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工造挽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碱璃,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓饭入,卻偏偏與公主長得像嵌器,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谐丢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容