不卡一区二区三区四区_乱中年女人伦av一区二区_美洲天堂一区二卡三卡四卡视频 _国产一区在线精品_91精品国产品国语在线不卡_99在线精品视频_99这里都是精品_国产99久久精品_99re成人在线_亚洲二区在线视频_久久先锋资源网_国产69精品久久久久毛片_亚洲一区二区三区视频在线_91小视频免费观看_欧美制服丝袜第一页_欧美日韩视频在线一区二区

您現在所在的位置:首頁 >學習資源 > 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入門
不卡一区二区三区四区_乱中年女人伦av一区二区_美洲天堂一区二卡三卡四卡视频 _国产一区在线精品_91精品国产品国语在线不卡_99在线精品视频_99这里都是精品_国产99久久精品_99re成人在线_亚洲二区在线视频_久久先锋资源网_国产69精品久久久久毛片_亚洲一区二区三区视频在线_91小视频免费观看_欧美制服丝袜第一页_欧美日韩视频在线一区二区
国产一区二区三区久久悠悠色av | 欧美中日韩免费视频| 成人在线综合网站| 成+人+亚洲+综合天堂| 99精品久久99久久久久| 91首页免费视频| 国产精品久久久久久久天堂第1集| 国产精品一区二区在线观看| 鲁丝一区二区三区免费| 亚洲人成网站在线观看播放| 欧美中文字幕亚洲一区二区va在线| 欧美亚洲禁片免费| 日韩一区二区在线免费观看| 日韩无一区二区| 国产日韩欧美不卡在线| 亚洲女性喷水在线观看一区| 日日夜夜精品免费视频| 精品一区二区精品| a4yy欧美一区二区三区| 精品免费国产| 一本久久a久久精品亚洲| 7777精品伊人久久久大香线蕉的| 久久综合九色综合欧美98| 中文字幕视频一区| 麻豆精品蜜桃视频网站| av在线不卡免费看| 欧洲一区二区在线观看| 欧美视频日韩视频在线观看| 久久久一区二区| 亚洲一区二区在线免费看| 精品一区二区三区免费播放| 99c视频在线| 亚洲欧美综合一区| 精品久久久久一区二区国产| 亚洲综合成人在线| 粉嫩aⅴ一区二区三区四区五区| 国产久一道中文一区| 一本色道**综合亚洲精品蜜桃冫| 精品久久国产97色综合| 亚洲男帅同性gay1069| 国内偷窥港台综合视频在线播放| 91嫩草免费看| 日本道免费精品一区二区三区| 久久久久久影视| 日一区二区三区| 99久久婷婷国产综合精品电影| 欧洲av一区| 亚洲精品一区在线观看| 日韩电影一二三区| 成人资源av| 欧美日韩精品高清| 亚洲欧美日韩国产综合在线| 国产伦精品一区二区三区免费| 久久综合久久久| 欧美一级欧美一级在线播放| 亚洲精品免费播放| 成人动漫中文字幕| 一本一道久久a久久精品 | 亚洲视频一区二区在线观看| 久久99久久99| 日韩免费av电影| www成人在线观看| 美女mm1313爽爽久久久蜜臀| 久久精品五月婷婷| 日韩你懂的在线观看| 午夜亚洲福利老司机| 国产精品久久久久久久久久久久冷 | 欧美在线视频二区| 日韩免费高清电影| 天天综合网 天天综合色| 99在线影院| 欧美一级爆毛片| 日本一区中文字幕| 久久综合中文色婷婷| 久久婷婷成人综合色| 欧美精品一区二区在线观看| 蜜桃av一区二区在线观看| 久久免费看av| 国产日韩亚洲欧美综合| 国产中文字幕一区| 日韩av电影免费在线| 久久久国产一区二区三区四区小说| 久久不见久久见免费视频1| 日韩欧美第二区在线观看| 国产欧美日韩精品在线| 成人黄色电影在线| 欧美日韩国产一区| 日韩高清欧美激情| 午夜午夜精品一区二区三区文| 国产精品无码永久免费888| av中文字幕亚洲| 日韩欧美一区二区在线视频| 久久99久久久久| 一本一本大道香蕉久在线精品 | 久久久久久夜精品精品免费| 国产福利91精品| 欧美怡红院视频| 亚洲成av人片在线| 日韩片电影在线免费观看| 亚洲欧美日韩在线不卡| 国产一区在线免费| 国产免费成人在线视频| 91麻豆产精品久久久久久| 日韩精品专区在线| 北条麻妃一区二区三区| xfplay精品久久| 波多野结衣中文字幕一区| 91精品一区二区三区久久久久久| 韩国中文字幕2020精品| 欧美日韩专区在线| 韩国午夜理伦三级不卡影院| 欧美日韩一二三区| 精品在线一区二区| 欧美日韩和欧美的一区二区| 国产一区二区三区在线观看精品| 欧美日韩一区二区三区不卡| 夜夜揉揉日日人人青青一国产精品| 久久久福利视频| 亚洲一区免费在线观看| 亚洲精品二区| 青草国产精品久久久久久| 欧美中文字幕不卡| 国产成人av网站| 久久毛片高清国产| 国产 高清 精品 在线 a| 亚洲桃色在线一区| 国产激情91久久精品导航| 欧美精品一区二| 国产在线精品一区二区三区| 亚洲三级在线看| 亚洲春色综合另类校园电影| 奇米影视在线99精品| 制服丝袜中文字幕亚洲| 91在线观看美女| 亚洲你懂的在线视频| 中文字幕av日韩精品| 久久国产视频网| 亚洲精品在线观看网站| 精品蜜桃传媒| 奇米精品一区二区三区在线观看 | 91久久偷偷做嫩草影院| 亚洲天堂精品视频| 91福利国产成人精品照片| 韩国av一区二区三区| 亚洲精品在线网站| 欧美成人一区二区在线| 久久99久久久欧美国产| 久久久不卡网国产精品二区 | 国产高清久久久| 久久网站热最新地址| 日本免费高清一区二区| 男人操女人的视频在线观看欧美| 91精品国产91久久综合桃花| 97netav| 日韩成人精品在线| www激情久久| 亚洲欧洲日韩精品| 成人黄色综合网站| 亚洲一区二区三区美女| 欧美精品精品一区| 精品欧美一区二区在线观看视频| 日韩vs国产vs欧美| 久久久久久久一区| 水蜜桃一区二区| 成人av电影在线播放| 亚洲国产精品精华液网站| 欧美一级艳片视频免费观看| 国产亚洲精品久久飘花| 激情综合亚洲精品| 亚洲欧美日韩人成在线播放| 欧美夫妻性生活| 欧美三级网色| 成人国产亚洲欧美成人综合网| 亚洲高清不卡在线观看| 欧美成人高清电影在线| 亚洲成人蜜桃| 999热视频在线观看| 中文字幕精品综合| 欧美人与z0zoxxxx视频| 欧美国产综合视频| 91在线国产观看| 精品亚洲成a人| 亚洲一区免费观看| 久久精品男人天堂av| 91九色最新地址| 精品视频第一区| www.欧美日韩| 伦理电影国产精品| 亚洲一区二区三区四区在线| 国产欧美一二三区| 日韩手机在线导航| 欧美性xxxxxxxx| 欧美激情视频一区二区三区| eeuss鲁片一区二区三区| 蜜臀久久99精品久久久久宅男| 亚洲精选在线视频| 国产欧美一区二区三区沐欲| 欧美一区二区三区在线观看| 色综合一个色综合亚洲| 久久99精品久久久久子伦|