詳細介紹Python 操作MySQL數據庫

jopen 9年前發布 | 23K 次閱讀 MySQL Python開發

 此篇隨筆是 Python 操作MySQL數據庫,下面我將把我自己所理解的筆記整理出來,以作為參考,希望對讀者有幫助

為了讓讀者能夠看懂筆者的隨筆 我將顏色加深了

</blockquote>

簡單介紹

  • Python 標準數據庫接口為"Python DB-API",而"Python DB-API"為開發人員提供了數據庫應用編程接口
  • Python 數據庫接口支持非常多的數據庫這里舉例五種
  • </ul>

    1. MySQL
    2. mSQL
    3. PostgreSQL
    4. Microsoft SQL Server
    5. Oracle
    6. </ol>

      • 如果想要知道更多,可以訪問官網Python數據庫接口及API查看詳細的支持數據庫列表
      • 對于不同的數據庫需要下載不同的DB API模塊,比如需要訪問Mysql數據庫和Oracle數據庫,則需要下載MySQL和Oracle數據庫模塊
      • Python的DB-API,為多數的數據庫實現了接口,使用它連接各數據庫后,就可以用相同的方式操作各數據庫
      • Python DB-API操作流程
      • </ul>

        1. 導入 DB-API 模塊
        2. 獲取與數據庫的連接
        3. 執行SQL語句和存儲過程
        4. 關閉數據庫連接
        5. </ol>

          此篇隨筆是 Python 操作MySQL數據庫,所以需要在操作系統安裝MySQLdb模塊來支持對Python操作Mysql數據庫

          MySQLdb 是用于Python鏈接Mysql數據庫的接口,它實現了 Python 數據庫 API 規范 V2.0,基于 MySQL C API 上建立的

          </blockquote>


          環境準備

          • 首先為了用Python的MySQLdb操作MySQL之前的準備條件
          • </ul>

            ? 必須確保操作系統(Linux CentOS)之上已經已經安裝了MySQL數據庫

            [root@MySQL ~]# rpm -qa | grep mysql                   //查詢系統中是否安裝Mysql
            [root@MySQL ~]# yum -y install mysql mysql-server      //安裝Mysql
            [root@MySQL ~]# service mysqld start                   //啟動Mysql
            [root@MySQL ~]# chkconfig mysqld on                    //設置Mysql開機啟動

            ? 在MySQL數據庫上創建數據庫 testdb

            mysql> show databases;                                 //顯示所有數據庫
            +--------------------+
            | Database           |
            +--------------------+
            | information_schema |
            | mysql              |
            | test               |
            +--------------------+
            3 rows in set (0.00 sec)
            mysql> create database testdb;                         //創建testdb數據庫
            Query OK, 1 row affected (0.00 sec)

            ? 在testdb數據庫中創建數據表 testtab

            ? testdb表字段里面有 id,name,age,sex

            mysql> use testdb;                                     //進入testdb數據庫
            Database changed
            mysql> create table testtab(                           //創建testtab數據表
                -> id int(4),
                -> name varchar(255),
                -> age int(3),
                -> sex varchar(1)
                -> );
            Query OK, 0 rows affected (0.01 sec)
            mysql> desc testtab;                                //顯示數據表屬性
            +-------+--------------+------+-----+---------+-------+
            | Field | Type         | Null | Key | Default | Extra |
            +-------+--------------+------+-----+---------+-------+
            | id    | int(4)       | YES  |     | NULL    |       |
            | name  | varchar(255) | YES  |     | NULL    |       |
            | age   | int(3)       | YES  |     | NULL    |       |
            | sex   | varchar(1)   | YES  |     | NULL    |       |
            +-------+--------------+------+-----+---------+-------+
            4 rows in set (0.00 sec)

            ? 授權連接數據庫testdb使用的用戶名為"root" ,密碼為 "test123",所有權限

            mysql> grant all privileges on testdb.* to 'root'@'%' identified by 'test123' with grant option;
            mysql> flush privileges;                              //刷新剛才修改的權限,使其生效
            Query OK, 0 rows affected (0.00 sec)


            ? 能連接MySQL保證系統中安裝了 Python MySQLdb 模塊

            ? 如果導入MySQLdb的輸出結果如下所示,意味著沒有安裝 MySQLdb 模塊

            [root@MySQL ~]# python
            Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)
            [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
            Type "help", "copyright", "credits" or "license" for more information.
            >>> import MySQLdb
            Traceback (most recent call last):
              File "<stdin>", line 1, in <module>
            ImportError: No module named MySQLdb

            ? 安裝MySQLdb,點擊進入從這里可選擇適合您的平臺的安裝包,分為預編譯的二進制文件和源代碼安裝包

            ? 這里使用源碼包進行安裝,先把依賴包進行安裝,不讓等下執行安裝的時候會出現很多錯誤...

            [root@MySQL ~]# yum install -y python-devel mysql-devel zlib-devel openssl-devel python-setuptools

            ? 下載MySQL-Python 并解壓、安裝

            [root@MySQL ~]# cd /usr/local/src/
            [root@MySQL src]# wget http://download.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.3.tar.gz
            [root@MySQL src]# tar zxf MySQL-python-1.2.3.tar.gz
            [root@MySQL src]# cd MySQL-python-1.2.3
            [root@MySQL MySQL-python-1.2.3]# python setup.py build
            [root@MySQL MySQL-python-1.2.3]# python setup.py install

            ? 如果導入MySQLdb的輸出沒有任何錯誤,意味著安裝 MySQLdb 模塊成功

            [root@MySQL ~]# python
            Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)
            [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
            Type "help", "copyright", "credits" or "license" for more information.
            >>> import MySQLdb
            >>>


            實例操作[創建、插入]

            • 鏈接MySQL的testdb數據庫并獲取一個字段的屬性
            • </ul>

              #!/usr/bin/python

              -- coding: UTF-8 --

              導入MySQLdb模塊

              import MySQLdb

              打開數據庫連接

              host 主機地址、user 用戶、passwd 密碼 、db 數據庫名稱、port 數據庫端口

              conn=MySQLdb.connect(host='192.168.1.187',user='root',passwd='test123',db='testdb',port=3306)

              使用cursor()方法獲取操作游標

              cur=conn.cursor()

              使用execute方法執行SQL語句

              cur.execute("describe testtab")

              使用 fetchone() 方法獲取一個字段的屬性

              data=cur.fetchone()

              打印data這條數據

              print data

              關閉數據庫連接

              conn.close()</pre></div>

              ? 執行以上腳本的輸出結果

              ('id', 'int(4)', 'YES', '', None, '')

              • 創建一個VFORBOX數據表
              • </ul>

                #!/usr/bin/python

                -- coding: UTF-8 --

                導入MySQLdb模塊

                import MySQLdb

                打開數據庫連接

                host 主機地址、user 用戶、passwd 密碼 、db 數據庫名稱、port 數據庫端口

                conn=MySQLdb.connect(host='192.168.1.187',user='root',passwd='test123',db='testdb',port=3306)

                使用cursor()方法獲取操作游標

                cur=conn.cursor()

                創建數據庫

                sql = """CREATE TABLE VFORBOX ( NAME CHAR(20) NOT NULL, AGE INT, SEX CHAR(1))"""

                使用execute方法執行SQL語句

                cur.execute(sql)

                關閉數據庫連接

                conn.close()</pre></div>

                ? 執行以上腳本的輸出結果

                mysql> use testdb;
                Database changed
                mysql> show tables;
                +------------------+
                | Tables_in_testdb |
                +------------------+
                | VFORBOX          |
                | testtab          |
                +------------------+
                2 rows in set (0.00 sec)
                mysql> describe VFORBOX;
                +-------+----------+------+-----+---------+-------+
                | Field | Type     | Null | Key | Default | Extra |
                +-------+----------+------+-----+---------+-------+
                | NAME  | char(20) | NO   |     | NULL    |       |
                | AGE   | int(11)  | YES  |     | NULL    |       |
                | SEX   | char(1)  | YES  |     | NULL    |       |
                +-------+----------+------+-----+---------+-------+
                3 rows in set (0.00 sec)

                • 執行 SQL INSERT 語句向表 VFORBOX 插入記錄
                • </ul>

                  #!/usr/bin/python

                  -- coding: UTF-8 --

                  導入MySQLdb模塊

                  import MySQLdb

                  打開數據庫連接

                  host 主機地址、user 用戶、passwd 密碼 、db 數據庫名稱、port 數據庫端口

                  conn=MySQLdb.connect(host='192.168.1.187',user='root',passwd='test123',db='testdb',port=3306)

                  使用cursor()方法獲取操作游標

                  cur=conn.cursor()

                  SQL 插入語句

                  sql = """INSERT INTO VFORBOX( NAME, AGE, SEX) VALUES ('Vforbox', 18, 'M')""" try:

                  執行sql語句

                  cur.execute(sql)

                  提交到數據庫執行

                  conn.commit()

                  except:

                  發生錯誤時回滾

                  conn.rollback()

                  關閉數據庫連接

                  conn.close()</pre></div>

                  ? 執行以上腳本的輸出結果

                  mysql> select * from VFORBOX;
                  +---------+------+------+
                  | NAME    | AGE  | SEX  |
                  +---------+------+------+
                  | Vforbox |   18 | M    |
                  +---------+------+------+
                  1 row in set (0.00 sec)

                  • 使用變量向SQL語句中傳遞參數(從以上稍做修改)
                  • </ul>

                    #!/usr/bin/python

                    -- coding: UTF-8 --

                    導入MySQLdb模塊

                    import MySQLdb

                    打開數據庫連接

                    host 主機地址、user 用戶、passwd 密碼 、db 數據庫名稱、port 數據庫端口

                    conn=MySQLdb.connect(host='192.168.1.187',user='root',passwd='test123',db='testdb',port=3306)

                    使用cursor()方法獲取操作游標

                    cur=conn.cursor()

                    SQL 插入語句

                    sql = "INSERT INTO VFORBOX( \ NAME, AGE, SEX) \ VALUES ('%s', '%d', '%c')" % \ ('vforbox', 18, 'M') try:

                    執行sql語句

                    cur.execute(sql)

                    提交到數據庫執行

                    conn.commit()

                    except:

                    發生錯誤時回滾

                    conn.rollback()

                    關閉數據庫連接

                    conn.close()</pre></div>

                    ? 執行以上腳本的輸出結果

                    mysql> select * from VFORBOX;
                    +---------+------+------+
                    | NAME    | AGE  | SEX  |
                    +---------+------+------+
                    | Vforbox |   18 | M    |
                    | Vforbox |   18 | M    |
                    +---------+------+------+
                    1 row in set (0.00 sec)


                    實例操作[查詢、更新]

                    • Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據
                    • </ul>

                      1. fetchone():  方法獲取下一個查詢結果集,結果集是一個對象
                      2. fetchall(): 接收全部的返回結果行
                      3. rowcount:  這是一個只讀屬性,并返回執行execute()方法后影響的行數
                      4. </ol>

                        • 查詢VFORBOX表中name(姓名)字段等于 vforbox 的所有數據
                        • </ul>

                          #!/usr/bin/python

                          -- coding: UTF-8 --

                          導入MySQLdb模塊

                          import MySQLdb

                          打開數據庫連接

                          host 主機地址、user 用戶、passwd 密碼 、db 數據庫名稱、port 數據庫端口

                          conn=MySQLdb.connect(host='192.168.1.187',user='root',passwd='test123',db='testdb',port=3306)

                          使用cursor()方法獲取操作游標

                          cur=conn.cursor()

                          SQL查詢語句

                          sql="SELECT * FROM VFORBOX WHERE NAME ='vforbox'"

                          try:

                          #執行SQL語句
                          cur.execute(sql)
                          

                          獲取所有記錄列表

                          res = cur.fetchall()
                          for s in res:
                            name=s[0]
                            age=s[1]
                            sex=s[2]
                          

                          打印結果輸出

                          print "name=%s,age=%d,sex=%s" % (name,age,sex)
                          

                          except: print u"錯誤:無法行程數據"

                          關閉數據庫連接

                          conn.close()</pre></div>

                          ? 執行以上腳本的輸出結果

                          name=vforbox,age=20,sex=M