精品久久久久久久久久久院品网_男女男精品视频_日韩**一区毛片_在线免费不卡电影_亚洲少妇屁股交4_久久国内精品视频_日韩一区二区三免费高清_亚洲成人手机在线_91看片淫黄大片一级在线观看_中文字幕亚洲在_日本一区二区在线不卡_欧美酷刑日本凌虐凌虐_理论电影国产精品_国产精品视频yy9299一区_99久久精品免费观看_国产精品久久三

您現在所在的位置:首頁 >學習資源 > Python全棧+人工智能入門教材 > Python基礎入門教程33:企業級開發進階6:數據庫操作

Python基礎入門教程33:企業級開發進階6:數據庫操作

來源:奇酷教育 發表于:

python作為一個編程語言,在開發B S或者C S結構的軟件時,不可避免的會設計到和數據庫之間的交互操作,和其他高級的面向對象的語言一樣,Py

python作為一個編程語言,在開發B/S或者C/S結構的軟件時,不可避免的會設計到和數據庫之間的交互操作,和其他高級的面向對象的語言一樣,Python在操作數據庫的過程中,盡量追求了簡潔、統一、易用的風格。

本節內容

  1. mysql數據庫連接驅動的安裝
  2. python連接mysql數據庫
  3. 增刪改查(CRUD)數據操作

    注意,關于mysql數據庫的教程,我們后續還在其他的模塊進行總結添加,如果大家需要的話^_^畢竟現在網絡上關于這樣常規的技術教程還是非常多滴

1. mysql數據庫連接驅動的安裝

1.1. 親,請明白為什么要有數據庫連接驅動

首先:我們明白,編程語言和數據庫各自都是什么
編程語言:專門用于進行數據處理的獨立的個體
數據庫:專門用于進行數據儲存的獨立的個體
也就是說,編程語言和數據庫本身是兩個完全獨立的個體,為了讓數據能更加優雅的持久的存儲和處理,編程語言就得和數據庫配合完成我們的工作

因為編程語言如果獨立處理數據的話,程序是運行在系統的內存中的,如果程序一旦終止,意味著處理的數據就會丟失。為了持久的有效的保存數據,我們選擇將處理的數據保存在數據庫中

其次:編程語言,憑什么可以訪問數據庫
數據庫給編程語言專門開了一個后門(API),通過這個后門(API)就可以讓編程語言對數據庫中的數據進行增刪改查操作了。當然,必須得拿著數據庫提供給編程語言的正確的鑰匙才是可以的哦【鑰匙:數據庫連接驅動+連接憑證】

最后:OK,此時,我們明白了,編程語言為什么和數據庫配合使用,為什么要有連接驅動,接下來,進入我們的安裝環節

python操作數據庫,其實就是兩個獨立個體之間的數據通信,和我們現實生活一樣,需要中間連接兩個獨立的人之間的手機和正確的電話號碼


python連接數據庫示意圖
1.2. 親,出錯了~

安裝數據庫驅動,我們想到的第一件事應該是搜索官方文檔或者問問度娘/谷哥,得到結果如下:

# 安裝mysql的python語言的數據庫連接驅動
pip install mysql-connector-python --allow-exrternal mysql-connector-python

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


python驅動版本


如果你跟我一樣,在一臺電腦上安裝了python2.7和python3.6的版本,尤其是目前使用的是python3.6的版本,上述安裝驅動方式就會出現版本不支持的錯誤,錯誤信息如下:


python3.4+版本安裝驅動報錯提示
1.3. 沒事,有我在!

如果是對于Python3.4+的版本,mysql官方提供的驅動已經不滿足我們的需要,此時需要安裝一個第三方的驅動來完成和數據庫的連接支持

這個神奇的第三方數據庫就是:PyMySQL

接下來,安裝它:

python3 -m pip install pymysql

安裝過程如下圖所示:


安裝pymysql模塊


安裝完成后,可以通過import引入到我們的python程序中哦

注意:python2和python3連操作數據庫的方式稍有差異,python2.x操作數據庫主要使用的是mysqldb模塊;python3.x操作數據庫我們選擇使用pymysql。當然,操作方式是一樣的,并沒有什么太大區別

2. python連接mysql數據庫

我們在前面的內容中,已經安裝好了數據庫連接驅動,接下來,通過python程序來連接數據庫
廢話不多,上干貨:

# 引入我們需要的操作數據庫模塊
import pymysql

# 連接數據庫
conn = pymysql.connect(
    host="localhost",   # 數據庫主機IP地址
    user="root",        # 數據庫登錄賬號
    password="",        # 數據庫登錄密碼
    database="pydb",    # 要連接的數據庫
    port=3306,          # 連接數據庫的端口號
    charset="utf-8"     # 使用指定編碼連接數據庫
)

請記住上面的代碼,連接數據庫就是這么簡單!
有人說~我記不住怎么辦,記不住那么多信息,可以記住pymysql.connect(),這樣總是可以的吧,然后進入pymysql提供的connections.py源代碼中就可以看到connect()方法,它是這么寫的

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中上面的代碼的意思比較簡單,每一個參數都通過參數名稱我們基本就能明白參數是什么意義了。常用的也就那么幾個。

3. python操作數據庫中的數據

首先,我們打開mysql數據庫編輯工具(這里我使用的是sqlyog操作mysql,大家可以隨意),創建用戶表(我們將數據庫表創建的稍微正式點):

# 創建數據庫
CREATE DATABASE pydb;

# 指定使用數據庫
USE pydb;

# 創建用戶表
CREATE TABLE users(
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL COMMENT '用戶賬號',
    userpass VARCHAR(50) NOT NULL COMMENT '登錄密碼',
    nickname VARCHAR(50) COMMENT '昵稱',
    age INT COMMENT '年齡',
    gender VARCHAR(5) COMMENT '性別',
    phone VARCHAR(15) COMMENT '聯系方式',
    email VARCHAR(50) COMMENT '郵箱',
    createTime DATETIME COMMENT '賬號創建時間',
    updateTime DATETIME COMMENT '賬號最后修改時間',
    lastLogin DATETIME COMMENT '賬號最后登錄時間',
    usersFlag INT COMMENT '賬號狀態:0 正常 1 鎖定 2 刪除',
    remark TEXT COMMENT '備注'
) DEFAULT CHARSET "utf8";

# 增加測試數據
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. 操作數據庫數據的步驟
  • 連接數據庫
  • 獲取一個訪問數據庫的操作對象
  • 定義SQL語句
  • 執行SQL語句
  • 處理結果
  • 關閉和數據庫之間的連接

    我們使用python操作數據庫,打開和數據庫的連接并維持連接是需要消耗系統資源滴,切記操作完成之后一定要關閉和數據庫之間的連接

3.2. 查詢數據庫中的數據

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

接下來,上干貨:

# 引入我們需要的操作數據庫模塊
import pymysql

# 數據庫連接信息
HOST = "localhost"
USER = "root"
PASSWORD = ""
DATABASE = "pydb"
PORT = 3306
CHARSET = "utf8"

# 使用異常包含處理過程,方便在finally中關閉和數據庫的連接
try:
    # 連接數據庫
    conn = pymysql.connect(
        host=HOST,   # 數據庫主機IP地址
        user=USER,        # 數據庫登錄賬號
        password=PASSWORD,        # 數據庫登錄密碼
        database=DATABASE,    # 要連接的數據庫
        port=PORT,          # 連接數據庫的端口號
        charset=CHARSET     # 使用指定編碼連接數據庫
    )

    # 獲取執行對象
    cursor = conn.cursor();

    # 定義查詢sql語句
    sql = "select * from users"

    # 執行sql語句
    rows = cursor.execute(sql)

    # 獲取查詢結果
    result = cursor.fetchall()

    # 遍歷查詢結果
    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("執行過程出現異常<%s>" % str(e))
finally:
    # 不論是否出現異常,執行完成后,保證數據庫連接關閉
    cursor.close()
    conn.close()

執行上述代碼,返回如下預期的結果

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>

下面是我們操作的過程中,明確操作結果就是一條數據的情況下

import pymysql

# 數據庫連接信息
HOST = "localhost"
USER = "root"
PASSWORD = ""
DATABASE = "pydb"
PORT = 3306
CHARSET = "utf8"

# 使用異常包含處理過程,方便在finally中關閉和數據庫的連接
try:
    # 連接數據庫
    conn = pymysql.connect(
        host=HOST,   # 數據庫主機IP地址
        user=USER,        # 數據庫登錄賬號
        password=PASSWORD,        # 數據庫登錄密碼
        database=DATABASE,    # 要連接的數據庫
        port=PORT,          # 連接數據庫的端口號
        charset=CHARSET     # 使用指定編碼連接數據庫
    )

    # 獲取執行對象
    cursor = conn.cursor()

    # 定義sql語句
    sql = "select * from users"

    # 執行sql語句
    rows = cursor.execute(sql)

    # 抓取查詢結果:獲取結果中的第一條數據
    result = cursor.fetchone()

    print("result:%s--%s--%s--%s" % (result[0], result[1], result[2], result[3]))
except Exception as e:
    print("出現異常<%s>" % str(e))
finally:
    # 關閉數據庫連接
    cursor.close()
    conn.close()

執行上述代碼,可以看到數據也是正常獲取的

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

3.3. 新增/更新/刪除數據到數據庫

廢話不說,直接上代碼,一定要看注釋啊

# 引入數據庫模塊
import pymysql

# 定義數據庫連接信息
HOST = "localhost"
USER = "root"
PASSWORD = ""
DATABASE = "pydb"
PORT = 3306
CHARSET = "utf8"

try:
    # 連接數據庫
    conn = pymysql.connect(
        host=HOST,
        user=USER,
        password=PASSWORD,
        database=DATABASE,
        port=PORT,
        charset=CHARSET
    )

    # 獲取執行對象
    cursor = conn.cursor()

    """
    增加數據到數據庫的操作: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")'

    # 執行sql語句
    rows = cursor.execute(insertSql)
    # 將更改的數據提交更新
    conn.commit()
    print("共有%d條數據被添加到數據庫中了" % rows)

    """
    更新數據到數據庫的操作:update
    """
    # 定義sql語句
    updateSql = 'update users set nickname = "凱特大叔" where id = 1'

    # 執行sql語句
    rows = cursor.execute(updateSql)
    # 將更改的數據提交更新
    conn.commit()
    print("共有%d條數據在數據庫中被修改了" % rows)

    """
    從數據庫中刪除數據:delete
    """
    # 定義sql語句
    deleteSql = 'delete from users where id = 2'

    # 執行sql語句
    rows = cursor.execute(deleteSql)
    # 將刪除數據進行提交更新
    conn.commit()
    print("共有%d條數據在數據庫中被刪除了" % rows)

except Exception as e:
    print("出現異常<%s>" % str(e))
finally:
    cursor.close()
    conn.close()

上述代碼,包含了基本的insert/update/delete三種類型的操作,分別操作了不同的數據

操作數據之間數據庫中的數據


python數據庫基本操作


上述程序運行結束之后數據庫中的數據,仔細觀察


python數據庫基本操作
3.4. 使用占位符進行數據操作【需要掌握】

在SQL操作的過程中,如果我們通過將SQL字符串和對應的數據通過拼接來操作的話,會變得非常的麻煩,大家可以試試上面的程序中的數據,如果都是用戶輸入的,然后增加到SQL語句中,會是什么樣的場景

所以有了占位符的方式,來簡化數據和SQL語句之間的操作,廢話不多,代碼大家一看就懂,上干貨:

# 引入數據庫模塊
import pymysql

# 定義數據庫連接信息
HOST = "localhost"
USER = "root"
PASSWORD = ""
DATABASE = "pydb"
PORT = 3306
CHARSET = "utf8"

try:
    # 連接數據庫
    conn = pymysql.connect(
        host=HOST,
        user=USER,
        password=PASSWORD,
        database=DATABASE,
        port=PORT,
        charset=CHARSET
    )

    # 獲取執行對象
    cursor = conn.cursor()

    """
    增加數據到數據庫的操作: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)'

    # 執行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"))
    # 將更改的數據提交更新
    conn.commit()
    print("共有%d條數據被添加到數據庫中了" % rows)

    """
    更新數據到數據庫的操作:update
    """
    # 定義sql語句
    updateSql = 'update users set nickname = %s where id = %s'

    # 執行sql語句
    rows = cursor.execute(updateSql, ["凱特大叔", 1])
    # 將更改的數據提交更新
    conn.commit()
    print("共有%d條數據在數據庫中被修改了" % rows)

    """
    從數據庫中刪除數據:delete
    """
    # 定義sql語句
    deleteSql = 'delete from users where id = %s'

    # 執行sql語句
    rows = cursor.execute(deleteSql, 1)
    # 將刪除數據進行提交更新
    conn.commit()
    print("共有%d條數據在數據庫中被刪除了" % rows)

except Exception as e:
    print("出現異常<%s>" % str(e))
finally:
    cursor.close()
    conn.close()

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

3.5. 批量操作及性能優化建議

在python中,為了方便進行批量數據的處理【批量數據增加、修改、刪除等操作】提供了一個executemany()函數,操作方式和占位符的方式有點類似

直接上干貨

# 引入數據庫模塊
import pymysql

# 定義數據庫連接信息
HOST = "localhost"
USER = "root"
PASSWORD = ""
DATABASE = "pydb"
PORT = 3306
CHARSET = "utf8"

try:
    # 連接數據庫
    conn = pymysql.connect(
        host=HOST,
        user=USER,
        password=PASSWORD,
        database=DATABASE,
        port=PORT,
        charset=CHARSET
    )

    # 獲取執行對象
    cursor = conn.cursor()

    """
    增加數據到數據庫的操作:使用占位符進行批量操作
    """
    # 定義sql語句
    insertSql = 'INSERT INTO users(username, userpass, nickname, age) VALUES(%s, %s, %s, %s)'
    args = [("member1", "123", "會員1", 12),
            ("member2", "123", "會員2", 34),
            ("member3", "123", "會員3", 23),
            ("member4", "123", "會員4", 42)]

    # 執行sql語句
    rows = cursor.executemany(insertSql, args)
    # 將更改的數據提交更新
    conn.commit()
    print("共有%d條數據被添加到數據庫中了" % rows)

except Exception as e:
    print("出現異常<%s>" % str(e))
finally:
    cursor.close()
    conn.close()

上述代碼中,我們可以看到,sql語句只是定義了一條語句,但是在后面的參數卻是一個列表,列表中包含了多條數據值,執行的時候多條數據值會一起插入到數據庫中

打開sqlyog,執行情況數據表users 的操作

truncate table users; # 清空users表中的數據

執行上述程序,數據庫中就出現對應的數據


pymysql批量執行增加數據操作

但是,我們要說的是但是
executemany(sql, args)函數只是適合執行多條數據,但是不要去執行大量數據(如執行幾千幾萬條數據)
這是為什么呢?
因為常規項目中,會有批量刪除、修改等操作,但是常規項目中的批量只是幾十條數據,為了簡化操作python提供了executemany()函數來實現了這樣的功能
但是大量數據操作,使用executemany()反倒會影響執行效率,讓數據庫操作變得緩慢,此時建議根據不同的數據庫使用多條sql語句拼接的方式來實現。


>>>更多VR/AR入門教程:VR入門
精品久久久久久久久久久院品网_男女男精品视频_日韩**一区毛片_在线免费不卡电影_亚洲少妇屁股交4_久久国内精品视频_日韩一区二区三免费高清_亚洲成人手机在线_91看片淫黄大片一级在线观看_中文字幕亚洲在_日本一区二区在线不卡_欧美酷刑日本凌虐凌虐_理论电影国产精品_国产精品视频yy9299一区_99久久精品免费观看_国产精品久久三
欧美精品日韩综合在线| 婷婷五月色综合| 欧美va亚洲va在线观看蝴蝶网| 国产a一区二区| 日韩国产在线一| 欧美精品一区在线观看| 亚洲欧洲在线一区| 7777精品伊久久久大香线蕉语言| 亚洲成人激情自拍| 欧美成va人片在线观看| 久久久久国产精品人| 欧美性大战xxxxx久久久| 国产精品久久久久久久久久直播 | 国产在线精品视频| 亚洲欧美日韩国产综合| 久久天天做天天爱综合色| 国产亚洲va综合人人澡精品 | 91丨九色丨黑人外教| 美腿丝袜在线亚洲一区| 亚洲综合丝袜美腿| 国产亚洲婷婷免费| 亚洲免费在线看| 免费视频一区二区| 人禽交欧美网站| 国产suv精品一区二区883| 美女网站视频久久| 丁香网亚洲国际| 国产精品中文字幕欧美| 精品在线免费视频| 久久99热99| 91视视频在线观看入口直接观看www | 久久久久久毛片| 亚洲午夜在线视频| 亚洲激情图片小说视频| 亚洲日本丝袜连裤袜办公室| 丝袜亚洲另类欧美| 日韩av成人高清| 成人亚洲一区二区一| 久99久在线| 国产在线一区二区三区四区| 成人情视频高清免费观看电影| 日韩电影在线播放| 亚洲砖区区免费| 精品欧美一区二区三区精品久久 | 蜜桃欧美视频| 日韩欧美在线一区二区| 欧美二区三区的天堂| **网站欧美大片在线观看| 亚洲精品一二三四区| 韩日精品视频一区| 成人黄色777网| 99精品国产视频| 成人动漫视频在线观看免费| 99中文字幕| 欧美偷拍一区二区| 亚洲品质自拍视频| 99re成人在线| 欧美日韩激情一区| 久久午夜免费电影| 综合久久综合久久| 国产a精品视频| 色婷婷激情久久| 91精品久久久久久蜜臀| 日韩精品一区二区三区三区免费 | 色哟哟国产精品| 国产精品大尺度| 午夜免费久久看| 国产麻豆精品一区二区| 日产精品高清视频免费| 久久精品欧美日韩精品 | 久久精品美女| 久久久久久一二三区| 国产曰批免费观看久久久| 图片区小说区区亚洲五月| 国产精品人成在线观看免费| 丝袜国产日韩另类美女| 99国产超薄丝袜足j在线观看 | 精品国产乱码久久久久久老虎| 美腿丝袜亚洲综合| 色视频一区二区三区| 亚洲天堂a在线| 国产一区二区三区无遮挡| 欧美精品一区二区三区很污很色的 | 国产伦精品一区二区三区四区免费| 欧美一区二区三区婷婷月色| 中文字幕免费观看一区| 一区二区三区在线不卡| 国产一二精品视频| 色综合久久88色综合天天6| 亚洲欧美日韩国产成人精品影院| 99精品久久久久久| 久久婷婷久久一区二区三区| 不卡视频免费播放| 精品噜噜噜噜久久久久久久久试看 | 亚洲一区成人在线| 欧美日韩无遮挡| 欧美成人精品高清在线播放| 国产乱码精品一区二区三区忘忧草| 在线观看欧美日本| 国产精品免费久久| 91一区二区在线| 久久亚洲二区三区| 91免费看`日韩一区二区| 久久亚洲综合av| 96久久精品| 国产精品久久久久9999吃药| 狠狠色综合色区| 精品国产乱码久久久久久蜜臀| 国产a级毛片一区| 欧美精品一区二区三区在线| av一本久道久久综合久久鬼色| 一本色道综合亚洲| 蜜臀国产一区二区三区在线播放 | 欧美电影在线免费观看| 国产麻豆91精品| 日韩精品一区在线观看| 成人激情综合网站| 国产女人aaa级久久久级 | 国产成人综合在线观看| 色偷偷一区二区三区| 裸体一区二区三区| 五月天婷亚洲天综合网鲁鲁鲁| 亚洲成av人片一区二区三区| 91久久精品一区二区二区| 一区二区三区四区亚洲| 亚洲午夜在线观看| 国产一区二区三区美女| 欧美精品一区二区不卡| 精品欧美国产| 日韩高清不卡一区二区三区| 91精品国产全国免费观看| 91捆绑美女网站| 亚洲精品成人a在线观看| 在线观看国产一区| 亚洲国产视频一区| 欧美日韩在线一区二区| 日韩精品三区四区| 日韩一区二区三区在线| 国产一区二区久久| 久久久777精品电影网影网 | 懂色中文一区二区三区在线视频| 中文字幕亚洲一区二区av在线 | 亚洲人一区二区| 国产成人精品亚洲777人妖| 中文字幕精品综合| 一本大道综合伊人精品热热| 不卡的av中国片| 一区二区三区四区不卡在线 | 国产在线精品一区二区| 欧美国产精品v| 中文一区一区三区免费| 97久久超碰国产精品| 亚洲成人av电影| 精品国产电影一区二区| 亚洲国产成人不卡| 天堂一区二区在线| 精品日韩一区二区三区| 日本免费高清一区二区| 一区二区久久久久久| 91精品国产日韩91久久久久久| 精品视频高清无人区区二区三区| 国内不卡的二区三区中文字幕| 专区另类欧美日韩| 日韩写真欧美这视频| 亚洲成人自拍视频| 91日韩一区二区三区| 日本vs亚洲vs韩国一区三区 | 色视频一区二区| 国产精品香蕉视屏| 国产揄拍国内精品对白| 一区二区三区不卡视频在线观看| 欧美一区二区三区免费在线看| 视频一区亚洲| 99久久99久久| 国产精品一级在线| 舔着乳尖日韩一区| 国产精品久久久久影视| 日韩午夜中文字幕| 欧美性色综合网| 小说区图片区图片区另类灬| 成人在线免费观看一区| 国产suv精品一区二区883| 免费三级欧美电影| 亚洲一区二区精品久久av| 欧美激情一区在线| 欧美成人高清电影在线| 欧美色视频在线观看| 一区二区三区国| 日韩在线第一区| 久久精品国产精品青草色艺| 91丨九色丨黑人外教| 国产精一区二区三区| 麻豆国产精品一区二区三区 | 91香蕉视频mp4| 国产不卡视频在线播放| 青娱乐精品在线视频| 亚洲香蕉伊在人在线观| 亚洲三级免费电影| 中文字幕人成不卡一区| 中文字幕欧美激情|