1. 程式人生 > 實用技巧 >資料開發_Python操作MySQL庫

資料開發_Python操作MySQL庫

Python中連線Mysql的包

  MySQLdb   是用於Python連結Mysql資料庫的介面,它實現了 Python 資料庫 API 規範 V2.0,基於 MySQL C API 上建立的
          支援 Python2.x   mysqlclient 原生 SQL 來操作資料庫 支援 Python3.x
  PyMySQL 是在 Python3.x 版本中用於連線 MySQL 伺服器的一個庫 
  mysql-connector 是 MySQL 官方提供的驅動器  mysql-connector 是 MySQL 官方提供的驅動器,
      它在Python中重新實現MySQL協議 不需要C庫,因此可移植性好 pip install mysql-connector
 ORM 框架 orm 英文全稱 object relational mapping 即物件對映關係程式
   SQLAlchemy 是Python程式語言下的一款ORM框架,該框架建立在資料庫API之上,使用關係物件對映進行資料庫操作
    SQLAlchemy本身無法操作資料庫,其必須以來pymsql等第三方外掛
   peewee

SQL中的DB-API

   01.-- 使用者可以使用這些資料生成的SQL程式碼並立即執行或輸出 如果不使用遊標功能,
     直接使用select查詢,會一次性將結果集列印到螢幕上,你無法針對結果集做第二次程式設計
   02.查詢語句可能返回多條記錄,如果資料量非常大,需要使用遊標來逐條讀取查詢結果集中的記錄
     遊標(CURSOR)
	   遊標(CURSOR)的特殊性在於它可以用迴圈對返回值進行逐條編譯,它具有隻讀性、不可跳躍性和遲鈍性
	   宣告(declare)、開啟(open)、關閉(close)遊標,並如何利用FETCH分別訪問它的每一行
	   遊標是一種處理資料的方法,主要用於儲存過程,觸發器和 T_SQL指令碼中, 遊標功能可以幫助我們對SQL語句得到的結果集,進行二次開發
    支援事務的資料庫, 在Python資料庫程式設計中,當遊標建立之時,就自動開始了一個隱形的資料庫事務。
	SELECT 語句後獲取資料,你可以把遊標作為 iterator,然後呼叫它的 fetchone() 方法來獲取一條匹配的行,
	    也可以呼叫 fetchall() 來得到包含多個匹配行的列表
     commit()方法遊標的所有更新操作,rollback()方法回滾當前遊標的所有操作
  03.  DB-API ,用於處理基於SQL的資料庫 Python中如果要連線資料庫,
  不管是MySQL、SQL Server、PostgreSQL亦或是SQLite,使用時都是採用遊標的方式
     Python所有的資料庫介面程式都在一定程度上遵守 Python DB-API 規範。
	 DB-API只中的錯誤定義
        錯誤類的層次關係:
             StandardError
             |__Warning
             |__Error
             |__InterfaceError
             |__DatabaseError
             |__DataError
             |__OperationalError
             |__IntegrityError
             |__InternalError
             |__ProgrammingError
             |__NotSupportedError

過程說明

1.Python DB-API 規範
  DB-API定義了一系列必須的物件和資料庫存取方式,以便為各種底層資料庫系統和多種多樣的資料庫介面程式提供一致的訪問介面
  DB-API與底層資料庫互動示例:
      程式碼 ⇆  使用DB-API ⇆  資料庫驅動程式 ⇆  底層資料庫(如MySQL等)
	   DB-API 2.0 規範的介面,這個規範是 PEP 249。
2.過程:
 # 01.開啟資料庫連線
      pymysql 可以支援查詢結果為字典型別,只需要指定cursorclass是pymysql.cursors.DictCursor即可
	  pymysql.cursors.Cursor(connection)#遊標結果作為元祖的元祖返回 Cursor: 預設,元組型別
	  SSDictCursor  SSCursor
 # 02.使用 cursor() 方法建立一個遊標物件 cursor
   cursor.description#返回遊標活動狀態
 # 03.使用 execute()  方法執行 SQL 查詢  
 # 04.使用 fetchone() 方法獲取單條資料.  fetchone() 方法獲取單條資料, 使用fetchall() 方法獲取多條資料
 # 05.關閉資料庫連線 db.close() 

示例程式碼

  # 安裝 pip install PyMySQL
 import pymysql.cursors
 
 # 連線資料庫
 connection = pymysql.connect(host='localhost',
                              user='user',
                              password='passwd',
                              db='db',
                              charset='utf8mb4',
                              cursorclass=pymysql.cursors.DictCursor)
 
 try:
    # #建立一個遊標向伺服器傳送命令及接收結果
     with connection.cursor() as cursor:
         # 建立一條新的記錄
         sql = "INSERT INTO `users` (`name`, `age`) VALUES (%s, %d)"
         cursor.execute(sql, ('[email protected]', 'very-secret'))
     # 連線完資料庫並不會自動提交,所以需要手動 commit 你的改動 #強制提交
     connection.commit()
 
     with connection.cursor() as cursor:
         # 讀取單條記錄
         sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
         cursor.execute(sql, ('python',))
         result = cursor.fetchone()
         print(result)
 finally:
     #關閉連線
     connection.close()

with 結束後會自動 close cursor == cursor.close()
# 說明 --兩種方式
 # 使用 Python 的字串操作來建立你的查詢語句 不推薦使用這種,防止SQL注入
 symbol = 'RHAT'
 cursor.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

 # 使用 ? 佔位符來代替值,然後把對應的值組成的元組做為 execute() 方法的第二個引數
  t = ('RHAT',)
  cursor.execute('SELECT * FROM stocks WHERE symbol=?', t)

參考

 sqlite3 --- SQLite 資料庫 DB-API 2.0 介面模組 https://docs.python.org/zh-cn/3/library/sqlite3.html
 PEP 249 -- Python Database API Specification v2.0 https://www.python.org/dev/peps/pep-0249/
 pymysql操作mysql詳解 https://www.jianshu.com/p/1ba64df4fd15