Python-操作 MySQL


  • Python 操作 MySQL 數據庫需要是使用到 PyMySQL 驅動
    • PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2 中則使用 mysqldb。
    • PyMySQL 遵循 Python 數據庫 API v2.0 規范,並包含了 pure-Python MySQL 客戶端庫。

    Python 操作 MySQL 前提是要安裝好 MySQL 數據庫並能正常連接使用,安裝步驟詳見下文。

  • 操作流程

    1. 安裝 MySQL 數據庫
    2. pymysql 模塊安裝與使用
    3. 獲取數據庫的連接
    4. 執行 sql 語句或存儲過程
    5. 關閉數據庫連接

    安裝 MySQL 數據庫

    注意:  安裝過程我們需要通過開啟管理員權限來安裝,否則會由於權限不足導致無法安裝。

  • Linux 上安裝 MySQL

    1、檢測系統是否自帶安裝 MySQL:

    rpm -qa | grep mysql

    2、如果查看到系統有安裝 MySQL,那可以選擇進行卸載:

    rpm -e mysql…  # 普通刪除模式rpm -e --nodeps mysql…  # 強力刪除模式,如果使用上面命令刪除時,提示有依賴的其它文件,則用該命令可以對其進行強力刪除

    3、安裝 MySQL

    首先需要先下載 MySQL 安裝包,官網下載地址下載對應版本即可,或直接在網上拉取並安裝:

    wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm # 獲取安裝包rpm -ivh mysql-community-release-el7-5.noarch.rpm # 安裝yum updateyum install mysql-server

    權限設置:

    chown mysql:mysql -R /var/lib/mysql

    初始化 MySQL:

    mysqld --initialize

    啟動 MySQL:

    systemctl start mysqld

    查看 MySQL 運行狀態:

    systemctl status mysqld

    4、修改默認密碼

    Mysql安裝成功后,默認的root用戶密碼為空,你可以使用以下命令來創建root用戶的密碼:

    mysqladmin -u root password "new_password";

    登陸:

    mysql -uroot -p'new_password'
  • Windows 上安裝

    1、下載

    Windows 上安裝 MySQL 相對來說會較為簡單,5.7 版本下載地址

    下載完后,將 zip 包解壓到自定義目錄,這里我將解壓后的文件夾放在 D:\Software\MySQL\mysql-5.7.28 下;

    2、配置

    接下來需要配置下 MySQL 的配置文件,打開剛剛解壓的文件夾 D:\Software\MySQL\mysql-5.7.28 ,在該文件夾下創建 my.ini 配置文件,編輯 my.ini 配置以下基本信息:

  • [client]
    # 設置mysql客戶端默認字符集
    default-character-set=utf8
     
    [mysqld]
    # 設置3306端口
    port = 3306
    # 設置mysql的安裝目錄
    basedir=D:\\Software\\MySQL\\mysql-5.7.28
    # 設置 mysql數據庫的數據的存放目錄,MySQL 8+ 不需要以下配置,系統自己生成即可,否則有可能報錯
    datadir=D:\\Software\\MySQL\\SqlData
    # 允許最大連接數
    max_connections=20
    # 服務端使用的字符集默認為8比特編碼的latin1字符集
    character-set-server=utf8
    # 創建新表時將使用的默認存儲引擎
    default-storage-engine=INNODB

     

  • 注意:還需要創建數據庫數據目錄,初始化數據庫的時候需要初始化數據目錄 在 Mysql 安裝目錄下創建數據目錄 datadir=D:\\Software\\MySQL\\SqlData
  • 啟動數據庫

    以管理員身份打開 cmd 命令行工具,切換至 Mysql 安裝目錄:

    cd D:\Software\MySQL\mysql-5.7.28\bin

    初始化數據庫:

    mysqld --initialize --console

    執行完成后,會輸出 root 用戶的初始默認密碼,如下所示:

    A temporary password is generated for root@localhost: feKm1E/-ExWM

    "feKm1E/-ExWM" 即為 Mysql 初始密碼

    輸入以下安裝命令:

  • mysqld install

    初始化數據目錄

    mysqld --initialize-insecure

    啟動 Mysql:

    net start mysql

    登陸:

    mysql -uroot -p
  •  

     

  • 剛安裝好的數據庫 默認密碼是空,可根據自身需要修改。

    windows 下修改 mysql 密碼:

  • mysql> select User from user;
    +---------------+
    | User          |
    +---------------+
    | mysql.session |
    | mysql.sys     |
    | root          |
    +---------------+
    3 rows in set (0.00 sec)
    
    mysql>
    mysql> update mysql.user set authentication_string=password('123456') where user='root';
    Query OK, 1 row affected, 1 warning (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 1
    
    mysql> flush privileges;     # 立即生效
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> quit
    # 退出重新登陸即可

     

  • 創建數據庫

    創建數據庫:

    create database test_db;

    查看數據庫:

  • mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | test_db            |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> use test_db;
    Database changed

     

  • pymysql 模塊安裝與數據庫 CURD

    一、安裝

    PyMySQL 模塊使用 pip命令進行安裝:

    pip3 install PyMySQL
  • 假如系統不支持 pip 命令,可以使用以下方式安裝:
  • $ git clone https://github.com/PyMySQL/PyMySQL
    $ cd PyMySQL/
    $ python3 setup.py install

     

  • pymysql 連接數據庫

    pymysql .connect 函數:連接上數據庫

  • # 導入模塊
    import pymysql
    
    # 打開數據庫連接
    
    conn = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="test_db",
        charset="utf8")
    
    print(conn)
    print(type(conn))
     

     

  • 輸出結果顯示如下:表面數據庫連接成功
  • <pymysql.connections.Connection object at 0x00000000022A54A8>
    <class 'pymysql.connections.Connection'>

     

  • 使用 pymysql 的 connect() 方法連接數據庫,connect  參數解釋如下:

    • host:MySQL服務的地址,若數據庫在本地上,使用 localhost 或者127.0.0.1。如果在其它的服務器上,則寫對應的 IP地址
    • port:服務的端口號,默認為3306,不寫則為默認值。
    • user:登錄數據庫的用戶名
    • passwd:登錄 MySQL 的密碼
    • db:數據庫名
    • charset:設置為 utf8 編碼,解決存漢字亂碼問題

    conn.cursor():獲取游標

    如果要操作數據庫,光連接數據是不夠的,咱們必須拿到操作數據庫的游標,才能進行后續的操作,游標的主要作用是用來接收數據庫操作后的返回結果,比如讀取數據、添加數據。通過獲取到的數據庫連接實例 conn 下的 cursor() 方法來創建游標,實例如下:

  • # 導入模塊
    import pymysql
    
    # 打開數據庫連接
    conn = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="test_db",
        charset="utf8")
    
    # print(conn)
    # print(type(conn))
    # 獲取連接下的游標
    cursor_test = conn.cursor()
    print(cursor_test)

     

  • 輸出結果為:
  • <pymysql.cursors.Cursor object at 0x000000000A544B00>
  • cursor 返回一個游標實例對象,其中包含了很多操作數據的方法,如執行sql語句,sql 執行命令:execute()executemany()

    execute(query,args=None):

    • 函數作用:執行單條的sql語句,執行成功后返回受影響的行數
    • 參數說明:
      • query:要執行的sql語句,字符串類型
      • args:可選的序列或映射,用於query的參數值。如果args為序列,query中必須使用%s做占位符;如果args為映射,query中必須使用%(key)s做占位符

    executemany(query,args=None):

    • 函數作用:批量執行sql語句,比如批量插入數據,執行成功后返回受影響的行數
    • 參數說明:
      • query:要執行的sql語句,字符串類型
      • args:嵌套的序列或映射,用於query的參數值

    其他游標對象如下表:

  • 完整數據庫連接操作實例如下:
  • # 導入模塊
    import pymysql
    
    # 打開數據庫連接
    conn = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="test_db",
        charset="utf8")
    # print(conn)
    # print(type(conn))
    
    # 獲取連接下的游標
    cursor_test = conn.cursor()
    print(cursor_test)
    
    # 使用 execute()  方法執行 SQL 查詢,查詢數據庫版本
    cursor_test.execute("SELECT VERSION()")
    
    # 使用 fetchone() 方法返回一條數據.
    data = cursor_test.fetchone()
    
    print("Database version : %s " % data)
    
    # 關閉數據庫連接
    conn.close()

     

  • 以上結果輸出為:

    Database version : 5.7.28
  • 創建表

    創建表代碼如下:

  • import pymysql
    
    # 打開數據庫連接
    conn = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="test_db",
        charset="utf8")
    
    # 獲取連接下的游標
    cursor_test = conn.cursor()
    
    # 使用 execute() 方法執行 SQL,如果表存在則刪除
    cursor_test.execute("DROP TABLE IF EXISTS EMPLOYEE")
    
    # 使用預處理語句創建表
    sql = """CREATE TABLE user1 (
             FIRST_NAME  CHAR(20) NOT NULL,
             LAST_NAME  CHAR(20),
             AGE INT,  
             SEX CHAR(1),
             INCOME FLOAT )"""
    
    cursor_test.execute(sql)
    
    # 關閉數據庫連接
    conn.close()

     

  • 如下所示數據庫表創建成功:
  • mysql> desc user1;
    +------------+----------+------+-----+---------+-------+
    | Field      | Type     | Null | Key | Default | Extra |
    +------------+----------+------+-----+---------+-------+
    | FIRST_NAME | char(20) | NO   |     | NULL    |       |
    | LAST_NAME  | char(20) | YES  |     | NULL    |       |
    | AGE        | int(11)  | YES  |     | NULL    |       |
    | SEX        | char(1)  | YES  |     | NULL    |       |
    | INCOME     | float    | YES  |     | NULL    |       |
    +------------+----------+------+-----+---------+-------+
    5 rows in set (0.00 sec)

     

  • 插入數據

    插入數據實現代碼:

  • import pymysql
    
    # 打開數據庫連接
    conn = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="test_db",
        charset="utf8")
    
    # 獲取連接下的游標
    cursor_test = conn.cursor()
    
    # 使用預處理語句創建表
    sql = """INSERT INTO user1(FIRST_NAME,
             LAST_NAME, AGE, SEX, INCOME)
             VALUES ('Fei', 'Fei', 20, 'M', 1000)"""
    
    try:
       # 執行sql語句
       cursor_test.execute(sql)
       # 提交到數據庫執行
       conn.commit()
    except:
       # 如果發生錯誤則回滾
       conn.rollback()
    
    # 關閉數據庫連接
    conn.close()

     

  • 插入數據結果:
  • mysql> select * from user1;
    +------------+-----------+------+------+--------+
    | FIRST_NAME | LAST_NAME | AGE  | SEX  | INCOME |
    +------------+-----------+------+------+--------+
    | Fei        | Fei       |   20 | M    |   1000 |
    +------------+-----------+------+------+--------+
    1 row in set (0.00 sec)

     

  • 查詢數據

    Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。

    • fetchone(): 該方法獲取下一個查詢結果集。結果集是一個對象
    • fetchall(): 接收全部的返回結果行.
    • rowcount: 這是一個只讀屬性,並返回執行 execute()方法后影響的行數。

    查詢數據代碼如下:

  • import pymysql
    
    
    # 打開數據庫連接
    conn = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="test_db",
        charset="utf8")
    
    # 獲取連接下的游標
    cursor_test = conn.cursor()
    
    sql = """
        select * from user1"""
    
    try:
        # 執行 sql 語句
        cursor_test.execute(sql)
        # 顯示出所有數據
        data_result = cursor_test.fetchall()
        for row in data_result:
            fname = row[0]
            lname = row[1]
            age = row[2]
            sex = row[3]
            income = row[4]
            # 打印結果
            print("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
                  (fname, lname, age, sex, income))
    except:
        print("Error: unable to fetch data")
    
    # 關閉數據庫連接
    conn.close()

     

  • 輸出結果:

    fname=Fei,lname=Fei,age=20,sex=M,income=1000.0
  • 數據庫表更新操作
  • # 導入模塊
    import pymysql
    
    # 打開數據庫連接
    conn = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="test_db",
        charset="utf8")
    # print(conn)
    # print(type(conn))
    
    # 獲取連接下的游標
    cursor_test = conn.cursor()
    
    sql = "UPDATE user1 SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
    
    try:
        # 執行SQL語句
        cursor_test.execute(sql)
        # 提交到數據庫執行
        conn.commit()
    except:
        # 發生錯誤時回滾
        conn.rollback()
    
    # 關閉數據庫連接
    conn.close()

     

  • 刪除操作

  • # 導入模塊
    import pymysql
    
    # 打開數據庫連接
    conn = pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="test_db",
        charset="utf8")
    # print(conn)
    # print(type(conn))
    
    # 獲取連接下的游標
    cursor_test = conn.cursor()
    
    sql = "DELETE * FROM user1"
    
    try:
        # 執行SQL語句
        cursor_test.execute(sql)
        # 提交到數據庫執行
        conn.commit()
    except:
        # 發生錯誤時回滾
        conn.rollback()
    
    # 關閉數據庫連接
    conn.close()

     

  • 錯誤處理

    DB API中定義了一些數據庫操作的錯誤及異常,下表列出了這些錯誤和異常:

  • 異 常 描 述
    Warning 當有嚴重警告時觸發,例如插入數據是被截斷等等。必須是 StandardError 的子類。
    Error 警告以外所有其他錯誤類。必須是 StandardError 的子類。
    InterfaceError 當有數據庫接口模塊本身的錯誤(而不是數據庫的錯誤)發生時觸發。必須是Error的子類。
    DatabaseError 和數據庫有關的錯誤發生時觸發。必須是Error的子類。
    DataError 當有數據處理時的錯誤發生時觸發,例如:除零錯誤,數據超范圍等等。必須是DatabaseError的子類。
    OperationalError 指非用戶控制的,而是操作數據庫時發生的錯誤。例如:連接意外斷開、 數據庫名未找到、事務處理失敗、內存分配錯誤等等操作數據庫是發生的錯誤。必須是DatabaseError的子類。
    IntegrityError 完整性相關的錯誤,例如外鍵檢查失敗等。必須是DatabaseError子類。
    InternalError 數據庫的內部錯誤,例如游標(cursor)失效了、事務同步失敗等等。必須是DatabaseError子類。
    ProgrammingError 程序錯誤,例如數據表(table)沒找到或已存在、SQL語句語法錯誤、 參數數量錯誤等等。必須是DatabaseError的子類。
    NotSupportedError 不支持錯誤,指使用了數據庫不支持的函數或API等。例如在連接對象上 使用.rollback()函數,然而數據庫並不支持事務或者事務已關閉。必須是DatabaseError的子類。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM