精品久久久久久久久久久院品网_男女男精品视频_日韩**一区毛片_在线免费不卡电影_亚洲少妇屁股交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久久精品免费观看_国产精品久久三
亚洲午夜影视影院在线观看| 国产在线视频欧美一区二区三区| 久久久亚洲国产美女国产盗摄 | 日韩欧美国产系列| 色94色欧美sute亚洲13| 一区二区不卡在线| 亚洲精品在线观看免费| 亚洲精品在线视频观看| 午夜老司机精品| 亚洲三区视频| 亚洲国产精品www| 亚洲午夜精品久久| 亚洲国产精品123| 欧美重口乱码一区二区| 国产尤物99| 美女被啪啪一区二区| 精品在线视频一区二区三区| 不卡欧美aaaaa| 91精品国产一区二区三区动漫| 成人在线视频首页| caoporm超碰国产精品| 成人黄色在线网站| 99久精品国产| 91青青草免费观看| 91久久爱成人| 99三级在线| 成人动漫视频在线观看免费| 91免费版在线看| 99精彩视频在线观看免费| 91免费精品国自产拍在线不卡| 99久久久久久| 91在线观看美女| 国产最新精品精品你懂的| 欧美在线一二三| 午夜精品一区二区三区四区 | 91美女蜜桃在线| 91免费看`日韩一区二区| 91天堂素人约啪| 国产日韩欧美二区| 欧美日韩国产精品一区二区| 日本午夜精品电影| 一区二区不卡在线| 欧美性猛交xxxx黑人交| 欧美精品久久天天躁| 日韩午夜中文字幕| 久久久久国产精品人| 国产精品欧美极品| 亚洲丝袜自拍清纯另类| 亚洲尤物在线视频观看| 奇米色一区二区| 成人午夜激情影院| 国产91精品一区二区绿帽| 好吊色欧美一区二区三区视频| 久久偷窥视频| 亚洲激情一区二区| 欧美日韩在线精品一区二区三区激情 | 亚洲精品一区二区三区av| 色偷偷久久一区二区三区| 欧美日韩一区高清| 欧美精品一区二区三区蜜桃 | 一本一道综合狠狠老| 欧美色网站导航| 26uuu亚洲| 亚洲一区二区三区爽爽爽爽爽| 免费看欧美女人艹b| aaa欧美色吧激情视频| 久久久久久九九九九| 欧美影院精品一区| 精品国产精品一区二区夜夜嗨| 最新日韩av在线| 免费高清视频精品| http;//www.99re视频| 自拍偷拍一区二区三区| 精品福利一区二区三区 | 国产三级精品在线| 亚洲午夜久久久久久久久久久| 老汉av免费一区二区三区| 91色综合久久久久婷婷| 亚洲电影网站| 精品国产一区二区三区四区四| 一区二区在线免费| 国产成人av资源| 欧美日韩高清免费| 欧美猛男gaygay网站| 欧美性高清videossexo| 国产欧美一区二区精品婷婷| 日韩激情一区二区| 成人av免费在线看| 欧美日韩一区精品| 一区二区在线观看免费| 成人av在线影院| 色综合久久久久| 国产精品第五页| 成人国产精品视频| 色www精品视频在线观看| 国产清纯美女被跳蛋高潮一区二区久久w | 精品国产精品网麻豆系列| 亚洲国产欧美在线人成| 不卡高清视频专区| 欧美日韩在线播放三区四区| 亚洲色图欧洲色图婷婷| av激情亚洲男人天堂| 日本电影欧美片| 成人免费在线视频| 91久久极品少妇xxxxⅹ软件 | 日本高清无吗v一区| 亚洲色图欧美偷拍| 91精品黄色| 先锋影音亚洲资源| 中文字幕永久在线不卡| av一二三不卡影片| 欧美精品乱码久久久久久按摩 | 3751色影院一区二区三区| 亚洲福利视频导航| 国产一区二区视频在线免费观看| 日韩欧美一级精品久久| 麻豆freexxxx性91精品| 日韩资源av在线| 国产精品毛片a∨一区二区三区| 国产麻豆精品在线| 色欧美日韩亚洲| 午夜精品免费在线观看| 免费看污久久久| 日韩一区中文字幕| 99国产精品久久久| 中文字幕一区二区三区有限公司 | 亚洲欧美一区二区三区极速播放| 91麻豆福利精品推荐| 日韩美女在线视频| 国产一区二区三区四 | 日本高清不卡一区| 丝袜亚洲另类欧美| 亚洲精品一区二区三区av| 亚洲激情自拍视频| 九色综合婷婷综合| 亚洲婷婷国产精品电影人久久| 999日本视频| 国产精品乱人伦中文| 91麻豆123| 亚洲国产精品国自产拍av| 91影院在线观看| 精品999在线播放| 久久国产视频网| 美女被啪啪一区二区| 亚洲欧美成人一区二区三区| 精品免费国产| 亚洲免费三区一区二区| 日本精品国语自产拍在线观看| 亚洲伦理在线免费看| 国产一区高清在线| 欧美一级高清片在线观看| 国产黄色精品视频| 精品国产伦一区二区三区观看体验| 国产传媒一区在线| 精品久久久久久久久久久久包黑料| 99久久精品免费观看| 久久―日本道色综合久久| av资源一区二区| 亚洲人一二三区| 亚洲欧美日产图| 久久精品999| 欧美电影免费提供在线观看| 97久久精品人人做人人爽| 欧美韩国一区二区| 美脚丝袜一区二区三区在线观看| 久久嫩草精品久久久精品一| 国产精品青青草| 亚洲自拍偷拍图区| 欧美性视频一区二区三区| 国产成人在线视频网址| 久久久影视传媒| 免费成人看片网址| 亚洲国产另类精品专区| 日韩资源av在线| 懂色av一区二区三区免费观看| 欧美激情综合五月色丁香小说| 欧洲亚洲一区二区三区四区五区| 三级精品在线观看| 日韩一区二区免费在线电影| 国产精品免费在线播放| 午夜a成v人精品| 日韩一级黄色大片| 久久涩涩网站| 精品亚洲成a人| 欧美一区二区不卡视频| 91浏览器入口在线观看| 亚洲欧美日韩在线| 欧日韩一区二区三区| 亚洲日本护士毛茸茸| 91美女在线观看| 精品福利一二区| 亚洲天堂电影网| 99vv1com这只有精品| 亚洲777理论| 国产丝袜在线精品| 欧美三级中文字| 欧美aaaaa喷水| 北岛玲一区二区三区四区| 亚洲成人av资源| 亚洲国产经典视频|