日韩 亚洲一区二_久久vs国产综合色大全_国产精品福利在线_欧美在线一级A片免费观看欧美在线_女同性毛片60分钟

您現(xiàn)在所在的位置:首頁(yè) >學(xué)習(xí)資源 > Python全棧+人工智慧入門(mén)教材 > Python基礎(chǔ)入門(mén)教程33:企業(yè)級(jí)開(kāi)發(fā)進(jìn)階6:資料庫(kù)操作

Python基礎(chǔ)入門(mén)教程33:企業(yè)級(jí)開(kāi)發(fā)進(jìn)階6:資料庫(kù)操作

來(lái)源:奇酷教育 發(fā)表於:

python作為一個(gè)程式語言,在開(kāi)發(fā)B S或者C S結(jié)構(gòu )的軟體時(shí),不可避免的會(huì)設(shè)計(jì)到和資料庫(kù)之間的交互操作,和其他高級(jí)的面向對(duì)象的語言一樣,Py

python作為一個(gè)程式語言,在開(kāi)發(fā)B/S或者C/S結(jié)構(gòu )的軟體時(shí),不可避免的會(huì)設(shè)計(jì)到和資料庫(kù)之間的交互操作,和其他高級(jí)的面向對(duì)象的語言一樣,Python在操作資料庫(kù)的過(guò)程中,儘量追求了簡(jiǎn)潔、統(tǒng)一、易用的風(fēng)格。

本節(jié)內(nèi)容

  1. mysql資料庫(kù)連接驅動(dòng)的安裝
  2. python連接mysql資料庫(kù)
  3. 增刪改查(CRUD)數(shù)據(jù)操作

    注意,關(guān)於mysql資料庫(kù)的教程,我們後續(xù)還在其他的模塊進(jìn)行總結(jié)添加,如果大家需要的話(huà)^_^畢竟現(xiàn)在網(wǎng)絡(luò)上關(guān)於這樣常規(guī)的技術(shù)教程還是非常多滴

1. mysql資料庫(kù)連接驅動(dòng)的安裝

1.1. 親,請明白為什麼要有資料庫(kù)連接驅動(dòng)

首先:我們明白,程式語言和資料庫(kù)各自都是什麼
程式語言:專(zhuān)門(mén)用於進(jìn)行數(shù)據(jù)處理的獨(dú)立的個(gè)體
資料庫(kù):專(zhuān)門(mén)用於進(jìn)行數(shù)據(jù)儲(chǔ)存的獨(dú)立的個(gè)體
也就是說(shuō),程式語言和資料庫(kù)本身是兩(liǎng)個(gè)完全獨(dú)立的個(gè)體,為了讓數(shù)據(jù)能更加優(yōu)雅的持久的存儲(chǔ)和處理,程式語言就得和資料庫(kù)配合完成我們的工作

因為程式語言如果獨(dú)立處理數(shù)據(jù)的話(huà),程序是運(yùn)行在系統(tǒng)的內(nèi)存中的,如果程序一旦終止,意味著處理的數(shù)據(jù)就會(huì)丟失。為了持久的有效的保存數(shù)據(jù),我們選擇將處理的數(shù)據(jù)保存在資料庫(kù)中

其次:程式語言,憑什麼可以訪(fǎng)問(wèn)資料庫(kù)
資料庫(kù)給程式語言專(zhuān)門(mén)開(kāi)了一個(gè)後門(mén)(API),通過(guò)這個(gè)後門(mén)(API)就可以讓程式語言對(duì)資料庫(kù)中的數(shù)據(jù)進(jìn)行增刪改查操作了。當(dāng)然,必須得拿著資料庫(kù)提供給程式語言的正確的鑰匙才是可以的哦【鑰匙:資料庫(kù)連接驅動(dòng)+連接憑證】

最後:OK,此時(shí),我們明白了,程式語言為什麼和資料庫(kù)配合使用,為什麼要有連接驅動(dòng),接下來(lái),進(jìn)入我們的安裝環(huán)節(jié)

python操作資料庫(kù),其實(shí)就是兩(liǎng)個(gè)獨(dú)立個(gè)體之間的數(shù)據(jù)通信,和我們現(xiàn)實(shí)生活一樣,需要中間連接兩(liǎng)個(gè)獨(dú)立的人之間的手機(jī)和正確的電話(huà)號(hào)碼


python連接資料庫(kù)示意圖
1.2. 親,出錯了~

安裝資料庫(kù)驅動(dòng),我們想到的第一件事應(yīng)該是搜索官方文檔或者問(wèn)問(wèn)度娘/谷哥,得到結(jié)果如下:


# 安裝mysql的python語言的資料庫(kù)連接驅動(dòng)

pip install mysql-connector-python --allow-exrternal mysql-connector-python

請注意:如果你使用的python版本是2.7或者3.4以下版本,是不會(huì)有任何問(wèn)題的,因為mysql官方提供的驅動(dòng)支持的最高版本是Python2.7或者python3.4,如下圖


python驅動(dòng)版本


如果你跟我一樣,在一臺(tái)電腦上安裝了python2.7和python3.6的版本,尤其是目前使用的是python3.6的版本,上述安裝驅動(dòng)方式就會(huì)出現(xiàn)版本不支持的錯誤,錯誤信息如下:


python3.4+版本安裝驅動(dòng)報(bào)錯提示
1.3. 沒事,有我在!

如果是對(duì)於Python3.4+的版本,mysql官方提供的驅動(dòng)已經(jīng)不滿(mǎn)足我們的需要,此時(shí)需要安裝一個(gè)第三方的驅動(dòng)來(lái)完成和資料庫(kù)的連接支持

這個(gè)神奇的第三方資料庫(kù)就是:PyMySQL

接下來(lái),安裝它:


python3 -m pip install pymysql

安裝過(guò)程如下圖所示:


安裝pymysql模塊


安裝完成後,可以通過(guò)import引入到我們的python程序中哦

注意:python2和python3連操作資料庫(kù)的方式稍有差異,python2.x操作資料庫(kù)主要使用的是mysqldb模塊;python3.x操作資料庫(kù)我們選擇使用pymysql。當(dāng)然,操作方式是一樣的,並沒有什麼太大區(qū)別

2. python連接mysql資料庫(kù)

我們在前面的內(nèi)容中,已經(jīng)安裝好了資料庫(kù)連接驅動(dòng),接下來(lái),通過(guò)python程序來(lái)連接資料庫(kù)
廢話(huà)不多,上乾貨:


# 引入我們需要的操作資料庫(kù)模塊

import pymysql



# 連接資料庫(kù)

conn = pymysql.connect(

    host="localhost",   # 資料庫(kù)主機(jī)IP位址

    user="root",        # 資料庫(kù)登錄帳號(hào)

    password="",        # 資料庫(kù)登錄密碼

    database="pydb",    # 要連接的資料庫(kù)

    port=3306,          # 連接資料庫(kù)的埠號(hào)

    charset="utf-8"     # 使用指定編碼連接資料庫(kù)

)

請記住上面的代碼,連接資料庫(kù)就是這麼簡(jiǎn)單!
有人說(shuō)~我記不住怎麼辦,記不住那麼多信息,可以記住pymysql.connect(),這樣總是可以的吧,然後進(jìn)入pymysql提供的connections.py原始碼中就可以看到connect()方法,它是這麼寫(xiě)的


def __init__(self, host=None, user=None, password="",

                 database=None, port=0, unix_socket=None,

                 charset='', sql_mode=None,

                 read_default_file=None, conv=None, use_unicode=None,

                 client_flag=0, cursorclass=Cursor, init_command=None,

                 connect_timeout=10, ssl=None, read_default_group=None,

                 compress=None, named_pipe=None, no_delay=None,

                 autocommit=False, db=None, passwd=None, local_infile=False,

                 max_allowed_packet=16*1024*1024, defer_connect=False,

                 auth_plugin_map={}, read_timeout=None, write_timeout=None,

                 bind_address=None):

上述pymysql的connections.py中上面的代碼的意思比較簡(jiǎn)單,每一個(gè)參數(shù)都通過(guò)參數(shù)名稱(chēng)我們基本就能明白參數(shù)是什麼意義了。常用的也就那麼幾個(gè)。

3. python操作資料庫(kù)中的數(shù)據(jù)

首先,我們打開(kāi)mysql資料庫(kù)編輯工具(這裡我使用的是sqlyog操作mysql,大家可以隨意),創(chuàng)建用戶(hù)表(我們將資料庫(kù)表創(chuàng)建的稍微正式點(diǎn)):


# 創(chuàng)建資料庫(kù)

CREATE DATABASE pydb;



# 指定使用資料庫(kù)

USE pydb;



# 創(chuàng)建用戶(hù)表

CREATE TABLE users(

    id INT AUTO_INCREMENT PRIMARY KEY,

    username VARCHAR(50) NOT NULL COMMENT '用戶(hù)帳號(hào)',

    userpass VARCHAR(50) NOT NULL COMMENT '登錄密碼',

    nickname VARCHAR(50) COMMENT '暱稱(chēng)',

    age INT COMMENT '年齡',

    gender VARCHAR(5) COMMENT '性別',

    phone VARCHAR(15) COMMENT '聯(lián)繫方式',

    email VARCHAR(50) COMMENT '郵箱',

    createTime DATETIME COMMENT '帳號(hào)創(chuàng)建時(shí)間',

    updateTime DATETIME COMMENT '帳號(hào)最後修改時(shí)間',

    lastLogin DATETIME COMMENT '帳號(hào)最後登錄時(shí)間',

    usersFlag INT COMMENT '帳號(hào)狀態(tài):0 正常 1 鎖定 2 刪除',

    remark TEXT COMMENT '備註'

) DEFAULT CHARSET "utf8";



# 增加測(cè)試數(shù)據(jù)

INSERT INTO users(username, userpass, nickname, age, gender, phone, email, createTime, updateTime, lastLogin, usersFlag, remark)

VALUES("tom", "123", "凱特", 48, "男", "13868686868", "cat@163.com", "2017-06-01","2017-06-02","2017-06-05",0,"tom and jerry 管理員"),

("jerry", "111", "傑瑞", 46, "女", "15688888888", "mouse@163.com", "2017-06-01","2017-06-03","2017-06-04",0,"tom and jerry 管理員");
3.1. 操作資料庫(kù)數(shù)據(jù)的步驟
  • 連接資料庫(kù)
  • 獲取一個(gè)訪(fǎng)問(wèn)資料庫(kù)的操作對(duì)象
  • 定義SQL語句
  • 執(zhí)行SQL語句
  • 處理結(jié)果
  • 關(guān)閉和資料庫(kù)之間的連接

    我們使用python操作資料庫(kù),打開(kāi)和資料庫(kù)的連接並維持連接是需要消耗系統(tǒng)資源滴,切記操作完成之後一定要關(guān)閉和資料庫(kù)之間的連接

3.2. 查詢資料庫(kù)中的數(shù)據(jù)

核心API:
executer(sql):執(zhí)行指定的sql語句,返回影響的行數(shù)
fetchall():獲取SQL操作的所有數(shù)據(jù)
fetchone():獲取SQL操作的第一條數(shù)據(jù)

接下來(lái),上乾貨:


# 引入我們需要的操作資料庫(kù)模塊

import pymysql



# 資料庫(kù)連接信息

HOST = "localhost"

USER = "root"

PASSWORD = ""

DATABASE = "pydb"

PORT = 3306

CHARSET = "utf8"



# 使用異常包含處理過(guò)程,方便在finally中關(guān)閉和資料庫(kù)的連接

try:

    # 連接資料庫(kù)

    conn = pymysql.connect(

        host=HOST,   # 資料庫(kù)主機(jī)IP位址

        user=USER,        # 資料庫(kù)登錄帳號(hào)

        password=PASSWORD,        # 資料庫(kù)登錄密碼

        database=DATABASE,    # 要連接的資料庫(kù)

        port=PORT,          # 連接資料庫(kù)的埠號(hào)

        charset=CHARSET     # 使用指定編碼連接資料庫(kù)

    )



    # 獲取執(zhí)行對(duì)象

    cursor = conn.cursor();



    # 定義查詢sql語句

    sql = "select * from users"



    # 執(zhí)行sql語句

    rows = cursor.execute(sql)



    # 獲取查詢結(jié)果

    result = cursor.fetchall()



    # 遍歷查詢結(jié)果

    for user in result:

        print("userid<%d>username<%s>userpass<%s>nickname<%s>createTime<%s>"

              % (user[0], user[1], user[2], user[3], user[8]))



except Exception as e:

    print("執(zhí)行過(guò)程出現(xiàn)異常<%s>" % str(e))

finally:

    # 不論是否出現(xiàn)異常,執(zhí)行完成後,保證資料庫(kù)連接關(guān)閉

    cursor.close()

    conn.close()

執(zhí)行上述代碼,返回如下預期的結(jié)果

userid<1>usernameuserpass<123>nickname<凱特>createTime<2017-06-01 00:00:00>
userid<2>username
userpass<111>nickname<傑瑞>createTime<2017-06-01 00:00:00>

下面是我們操作的過(guò)程中,明確操作結(jié)果就是一條數(shù)據(jù)的情況下


import pymysql



# 資料庫(kù)連接信息

HOST = "localhost"

USER = "root"

PASSWORD = ""

DATABASE = "pydb"

PORT = 3306

CHARSET = "utf8"



# 使用異常包含處理過(guò)程,方便在finally中關(guān)閉和資料庫(kù)的連接

try:

    # 連接資料庫(kù)

    conn = pymysql.connect(

        host=HOST,   # 資料庫(kù)主機(jī)IP位址

        user=USER,        # 資料庫(kù)登錄帳號(hào)

        password=PASSWORD,        # 資料庫(kù)登錄密碼

        database=DATABASE,    # 要連接的資料庫(kù)

        port=PORT,          # 連接資料庫(kù)的埠號(hào)

        charset=CHARSET     # 使用指定編碼連接資料庫(kù)

    )



    # 獲取執(zhí)行對(duì)象

    cursor = conn.cursor()



    # 定義sql語句

    sql = "select * from users"



    # 執(zhí)行sql語句

    rows = cursor.execute(sql)



    # 抓取查詢結(jié)果:獲取結(jié)果中的第一條數(shù)據(jù)

    result = cursor.fetchone()



    print("result:%s--%s--%s--%s" % (result[0], result[1], result[2], result[3]))

except Exception as e:

    print("出現(xiàn)異常<%s>" % str(e))

finally:

    # 關(guān)閉資料庫(kù)連接

    cursor.close()

    conn.close()

執(zhí)行上述代碼,可以看到數(shù)據(jù)也是正常獲取的

result:1--tom--123--凱特

3.3. 新增/更新/刪除數(shù)據(jù)到資料庫(kù)

廢話(huà)不說(shuō),直接上代碼,一定要看注釋啊


# 引入資料庫(kù)模塊

import pymysql



# 定義資料庫(kù)連接信息

HOST = "localhost"

USER = "root"

PASSWORD = ""

DATABASE = "pydb"

PORT = 3306

CHARSET = "utf8"



try:

    # 連接資料庫(kù)

    conn = pymysql.connect(

        host=HOST,

        user=USER,

        password=PASSWORD,

        database=DATABASE,

        port=PORT,

        charset=CHARSET

    )



    # 獲取執(zhí)行對(duì)象

    cursor = conn.cursor()



    """

    增加數(shù)據(jù)到資料庫(kù)的操作:insert

    """

    # 定義sql語句

    insertSql = 'INSERT INTO users(username, userpass, nickname, age, gender, phone, email, createTime, updateTime, lastLogin, usersFlag, remark)\

            VALUES("shuke", "123", "舒克", 42, "男", "15686868686", "shuke@163.com", "2017-06-01","2017-06-02","2017-06-05",0,"shuke and beita")'



    # 執(zhí)行sql語句

    rows = cursor.execute(insertSql)

    # 將更改的數(shù)據(jù)提交更新

    conn.commit()

    print("共有%d條數(shù)據(jù)被添加到資料庫(kù)中了" % rows)



    """

    更新數(shù)據(jù)到資料庫(kù)的操作:update

    """

    # 定義sql語句

    updateSql = 'update users set nickname = "凱特大叔" where id = 1'



    # 執(zhí)行sql語句

    rows = cursor.execute(updateSql)

    # 將更改的數(shù)據(jù)提交更新

    conn.commit()

    print("共有%d條數(shù)據(jù)在資料庫(kù)中被修改了" % rows)



    """

    從資料庫(kù)中刪除數(shù)據(jù):delete

    """

    # 定義sql語句

    deleteSql = 'delete from users where id = 2'



    # 執(zhí)行sql語句

    rows = cursor.execute(deleteSql)

    # 將刪除數(shù)據(jù)進(jìn)行提交更新

    conn.commit()

    print("共有%d條數(shù)據(jù)在資料庫(kù)中被刪除了" % rows)



except Exception as e:

    print("出現(xiàn)異常<%s>" % str(e))

finally:

    cursor.close()

    conn.close()

上述代碼,包含了基本的insert/update/delete三種類(lèi)型的操作,分別操作了不同的數(shù)據(jù)

操作數(shù)據(jù)之間資料庫(kù)中的數(shù)據(jù)


python資料庫(kù)基本操作


上述程序運(yùn)行結(jié)束之後資料庫(kù)中的數(shù)據(jù),仔細(xì)觀(guān)察


python資料庫(kù)基本操作
3.4. 使用佔位符進(jìn)行數(shù)據(jù)操作【需要掌握】

在SQL操作的過(guò)程中,如果我們通過(guò)將SQL字符串和對(duì)應(yīng)的數(shù)據(jù)通過(guò)拼接來(lái)操作的話(huà),會(huì)變得非常的麻煩,大家可以試試上面的程序中的數(shù)據(jù),如果都是用戶(hù)輸(shū)入的,然後增加到SQL語句中,會(huì)是什麼樣的場(chǎng)景

所以有了佔位符的方式,來(lái)簡(jiǎn)化數(shù)據(jù)和SQL語句之間的操作,廢話(huà)不多,代碼大家一看就懂,上乾貨:


# 引入資料庫(kù)模塊

import pymysql



# 定義資料庫(kù)連接信息

HOST = "localhost"

USER = "root"

PASSWORD = ""

DATABASE = "pydb"

PORT = 3306

CHARSET = "utf8"



try:

    # 連接資料庫(kù)

    conn = pymysql.connect(

        host=HOST,

        user=USER,

        password=PASSWORD,

        database=DATABASE,

        port=PORT,

        charset=CHARSET

    )



    # 獲取執(zhí)行對(duì)象

    cursor = conn.cursor()



    """

    增加數(shù)據(jù)到資料庫(kù)的操作:insert

    """

    # 定義sql語句

    insertSql = 'INSERT INTO users(username, userpass, nickname, age, gender, phone, email, createTime, updateTime, lastLogin, usersFlag, remark)\

            VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'



    # 執(zhí)行sql語句

    rows = cursor.execute(insertSql, ("shuke", "123", "舒克", 42, "男", "15686868686", "shuke@163.com", "2017-06-01","2017-06-02","2017-06-05",0,"shuke and beita"))

    # 將更改的數(shù)據(jù)提交更新

    conn.commit()

    print("共有%d條數(shù)據(jù)被添加到資料庫(kù)中了" % rows)



    """

    更新數(shù)據(jù)到資料庫(kù)的操作:update

    """

    # 定義sql語句

    updateSql = 'update users set nickname = %s where id = %s'



    # 執(zhí)行sql語句

    rows = cursor.execute(updateSql, ["凱特大叔", 1])

    # 將更改的數(shù)據(jù)提交更新

    conn.commit()

    print("共有%d條數(shù)據(jù)在資料庫(kù)中被修改了" % rows)



    """

    從資料庫(kù)中刪除數(shù)據(jù):delete

    """

    # 定義sql語句

    deleteSql = 'delete from users where id = %s'



    # 執(zhí)行sql語句

    rows = cursor.execute(deleteSql, 1)

    # 將刪除數(shù)據(jù)進(jìn)行提交更新

    conn.commit()

    print("共有%d條數(shù)據(jù)在資料庫(kù)中被刪除了" % rows)



except Exception as e:

    print("出現(xiàn)異常<%s>" % str(e))

finally:

    cursor.close()

    conn.close()

上述代碼的執(zhí)行操作,和前面的基本操作是一致的,大家可以試試。

3.5. 批量操作及性能優(yōu)化建議

在python中,為了方便進(jìn)行批量數(shù)據(jù)的處理【批量數(shù)據(jù)增加、修改、刪除等操作】提供了一個(gè)executemany()函數(shù),操作方式和佔位符的方式有點(diǎn)類(lèi)似

直接上乾貨


# 引入資料庫(kù)模塊

import pymysql



# 定義資料庫(kù)連接信息

HOST = "localhost"

USER = "root"

PASSWORD = ""

DATABASE = "pydb"

PORT = 3306

CHARSET = "utf8"



try:

    # 連接資料庫(kù)

    conn = pymysql.connect(

        host=HOST,

        user=USER,

        password=PASSWORD,

        database=DATABASE,

        port=PORT,

        charset=CHARSET

    )



    # 獲取執(zhí)行對(duì)象

    cursor = conn.cursor()



    """

    增加數(shù)據(jù)到資料庫(kù)的操作:使用佔位符進(jìn)行批量操作

    """

    # 定義sql語句

    insertSql = 'INSERT INTO users(username, userpass, nickname, age) VALUES(%s, %s, %s, %s)'

    args = [("member1", "123", "會(huì)員1", 12),

            ("member2", "123", "會(huì)員2", 34),

            ("member3", "123", "會(huì)員3", 23),

            ("member4", "123", "會(huì)員4", 42)]



    # 執(zhí)行sql語句

    rows = cursor.executemany(insertSql, args)

    # 將更改的數(shù)據(jù)提交更新

    conn.commit()

    print("共有%d條數(shù)據(jù)被添加到資料庫(kù)中了" % rows)



except Exception as e:

    print("出現(xiàn)異常<%s>" % str(e))

finally:

    cursor.close()

    conn.close()

上述代碼中,我們可以看到,sql語句只是定義了一條語句,但是在後面的參數(shù)卻是一個(gè)列表,列表中包含了多條數(shù)據(jù)值,執(zhí)行的時(shí)候多條數(shù)據(jù)值會(huì)一起插入到資料庫(kù)中

打開(kāi)sqlyog,執(zhí)行情況數(shù)據(jù)表users 的操作


truncate table users; # 清空users表中的數(shù)據(jù)

執(zhí)行上述程序,資料庫(kù)中就出現(xiàn)對(duì)應(yīng)的數(shù)據(jù)


pymysql批量執(zhí)行增加數(shù)據(jù)操作

但是,我們要說(shuō)的是但是
executemany(sql, args)函數(shù)只是適合執(zhí)行多條數(shù)據(jù),但是不要去執(zhí)行大量數(shù)據(jù)(如執(zhí)行幾千幾萬(wàn)條數(shù)據(jù))
這是為什麼呢?
因為常規(guī)項(xiàng)目中,會(huì)有批量刪除、修改等操作,但是常規(guī)項(xiàng)目中的批量只是幾十條數(shù)據(jù),為了簡(jiǎn)化操作python提供了executemany()函數(shù)來(lái)實(shí)現(xiàn)了這樣的功能
但是大量數(shù)據(jù)操作,使用executemany()反倒會(huì)影響執(zhí)行效率,讓資料庫(kù)操作變得緩慢,此時(shí)建議根據(jù)不同的資料庫(kù)使用多條sql語句拼接的方式來(lái)實(shí)現(xiàn)。


>>>更多VR/AR入門(mén)教程:VR入門(mén)