<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用 Python 操作 MySQL,這篇文章別錯過~

          共 4154字,需瀏覽 9分鐘

           ·

          2021-02-05 23:08


          閱讀本文大概需要 14 分鐘。




          1. 前言

          在爬蟲、自動化、數據分析、軟件測試、Web 等日常操作中,除?JSON、YAML、XML 外,還有一些數據經常會用到,比如:Mysql、Sqlite、Redis、MongoDB、Memchache?
          一般情況下,我們都會使用特定的客戶端或命令行工具去操作;但是如果涉及到工程項目,將這部分數據操作集成到代碼中使用才是王道
          接下來,我將分幾篇文章,和大家一起聊聊 Python 操作這些數據的 最優(yōu) 方案
          篇從使用最為廣泛的關系型數據庫 - Mysql 開始講起

          2. 準備

          首先,我們通過 Mysql 客戶端或命令行創(chuàng)建一個數據庫?xh
          然后,在這個數據庫下建一張簡單的表?people
          為了便于演示,這里只創(chuàng)建了三個字段:id、name、age,其中 id 為主鍵
          Python 操作 Mysql 主要包含下面 3 種方式:
          • Python-MySql

          • PyMysql

          • SQLAlchemy

          其中,
          Python-MySql 由 C 語法打造,接口精煉,性能最棒;但是由于環(huán)境依賴多,安裝復雜,已停止更新,僅支持 Python2
          PyMysql?為替代 Python-Mysql 而生,純 Python?語言編寫的 Mysql 操作客戶端,安裝方便,支持 Python3
          SQLAlchemy 是一個非常強大的 ORM 框架,不提供底層的數據庫操作,主要是通過定義模型對應數據表結構,在 Python Web 編程領域應用廣泛
          由于 Python-MySql? 不支持 Python3,所以本文只談后 2 種操作方式

          3. PyMysql

          首先,使用 pip?安裝依賴
          #?安裝依賴
          pip3?install?pymysql
          連接數據庫,獲取數據庫連接對象及游標對象
          使用?pymysql 中的 connect() 方法,傳入數據庫的 HOST 地址、端口號、用戶名、密碼、待操作數據庫的名稱,即可以獲取?數據庫的連接對象
          然后,再通過數據庫連接對象,獲取執(zhí)行數據庫具體操作的?游標對象
          import?pymysql

          #?數據庫連接
          self.db?=?pymysql.connect(host='localhost',
          ??????????????????????????port=3306,
          ??????????????????????????user='root',
          ??????????????????????????password='**',
          ??????????????????????????database='xh')

          #?獲取游標
          self.cursor?=?self.db.cursor()
          接著,我們來實現增刪改查操作
          1、新增
          新增包含新增單條數據和多條數據
          對于單條數據的插入,只需要編寫一條插入的 SQL 語句,然后作為參數執(zhí)行上面游標對象的?execute(sql) 方法,最后使用數據庫連接對象的 commit() 方法將數據提交到數據庫中
          #?插入一條數據
          SQL_INSERT_A_ITEM?=?"INSERT?INTO?PEOPLE(name,age)?VALUES('xag',23);"

          def?insert_a_item(self):
          ????"""
          ????插入一條數據
          ????:return:
          ????"""

          ????try:
          ????????self.cursor.execute(SQL_INSERT_A_ITEM)
          ????????self.db.commit()
          ????except?Exception?as?e:
          ????????print('插入數據失敗')
          ????????print(e)
          ????????self.db.rollback()
          使用執(zhí)行游標對象的?executemany() 方法,傳入插入的 SQL 語句及?位置變量列表,可以實現一次插入多條數據
          #?插入多條數據SQL,name和age是變量,對應列表
          SQL_INSERT_MANY_ITEMS?=?"INSERT?INTO?PEOPLE?(name,?age)?VALUES(%s,?%s)"

          #?待插入的數據
          self.datas?=?[("張三",?23),?("李四",?24),?("王五",?25)]

          def?insert_items(self):
          ????"""
          ????插入多條記錄
          ????:return:
          ????"""

          ????try:
          ????????self.cursor.executemany(SQL_INSERT_MANY_ITEMS,?self.datas)
          ????????self.db.commit()
          ????except?Exception?as?e:
          ????????print("插入數據異常")
          ????????self.db.rollback()
          需要注意的是,PyMysql 會將 SQL 語句中的所有字段當做字符串進行處理,所以這里的 age 字段在 SQL 中被當做字符串處理
          2、查詢
          查詢分為三步,分別是:
          • 通過游標對象執(zhí)行具體的 SQL 語句

          • 通過游標對象,獲取到元組數據

          • 遍歷元組數據,查看結果

          比如:查看數據表中所有的記錄
          #?查詢所有記錄
          SQL_QUERY_ALL?=?"SELECT?*?FROM?PEOPLE;"

          def?query(self):
          ????"""查詢數據"""
          ????#?查詢所有數據
          ????self.cursor.execute(SQL_QUERY_ALL)

          ????#?元組數據
          ????rows?=?self.cursor.fetchall()

          ????#?打印結果
          ????for?row?in?rows:
          ????????id?=?row[0]
          ????????name?=?row[1]
          ????????age?=?row[2]
          ????????print('id:',?id,?',name:',?name,?'age:',?age)
          如果需要按條件查詢某一條記錄,只需要修改 SQL 語句即可實現
          #?按id查詢
          SQL_QUERY_WITH_CONDITION?=?"SELECT?*?FROM?PEOPLE?WHERE?id={};"

          #?查詢id為5的記錄
          self.cursor.execute(SQL_QUERY_WITH_CONDITION.format(5))
          3、更新
          新增操作 類似,更新操作也是通過游標對象去執(zhí)行更新的 SQL?語句,最后利用數據庫連接對象將數據真實更新到數據庫中
          #?更新(通過id去更新)
          SQL_UPDATE?=?"UPDATE?PEOPLE?SET?name='%s',age=%s?WHERE?id=%s"

          def?update(self):
          ????"""
          ????更新數據
          ????:return:
          ????"""

          ????sql_update?=?SQL_UPDATE?%?("王五五",?30,?5)
          ????print(sql_update)

          ????try:
          ????????self.cursor.execute(sql_update)
          ????????self.db.commit()
          ????except?Exception?as?e:
          ????????self.db.rollback()
          ????????print('更新數據異常')
          ????????print(e)
          4、刪除
          刪除操作同查詢、新增操作類似,只需要變更 SQL 語句即可
          #?刪除(通過id去刪除數據)
          SQL_DELETE?=?"DELETE?FROM?PEOPLE?WHERE?id=%d"

          def?delete(self):
          ????"""
          ????刪除記錄
          ????:return:
          ????"""

          ????try:
          ????????#?刪除的完整sql
          ????????sql_del?=?SQL_DELETE?%?(5)
          ????????self.cursor.execute(sql_del)
          ????????self.db.commit()
          ????except?Exception?as?e:
          ????????#?發(fā)生錯誤時回滾
          ????????self.db.rollback()
          ????????print(e)
          最后,我們需要將游標對象和數據庫連接對象資源釋放掉
          def?teardown(self):
          ????#?釋放資源
          ????self.cursor.close()
          ????self.db.close()

          4.?SQLAlchemy

          首先,使用 SQLAlchemy 操作 Mysql 數據庫同樣先需要安裝依賴庫
          #?安裝依賴包
          pip3?install?sqlalchemy
          通過 SQLAlchemy?的內置方法?declarative_base()?創(chuàng)建一個基礎類 Base
          然后,自定義一個 Base 類的子類,內部定義靜態(tài)變量,和上面數據表 people 中的字段一一對應
          from?sqlalchemy?import?Column,?Integer,?String,?create_engine
          from?sqlalchemy.ext.declarative?import?declarative_base

          #?基礎類
          Base?=?declarative_base()


          #?自定義的表
          class?People(Base):
          ????#?表名
          ????__tablename__?=?'people'

          ????#?定義字段
          ????id?=?Column(Integer,?primary_key=True)
          ????name?=?Column(String(255))
          ????age?=?Column(Integer)

          ????def?__repr__(self):
          ????????"""
          ????????便于打印結果
          ????????:return:
          ????????"""

          ????????return?".format(self.id,?self.name,?self.age)
          接著,通過數據庫名、用戶名、密碼及 Host 組裝一個數據庫連接地址,作為參數傳入到?SQLAlchemy 的?create_engine()?方法中,以創(chuàng)建一個數據庫引擎實例對象
          #?創(chuàng)建數據庫的引擎實例對象
          #?數據庫名稱:xh
          engine?=?create_engine("mysql+pymysql://root:數據庫密碼@localhost:3306/xh",
          ???????????????????????????????encoding="utf-8",
          ???????????????????????????????echo=True)
          最后,通過數據庫引擎在數據庫中創(chuàng)建表結構,并實例化一個?會話對象
          需要注意的是,create_all() 方法中的?checkfirst 參數如果傳入 True,則會判斷數據表是否存在,如果表存在,則不會重新創(chuàng)建
          #?創(chuàng)建表結構
          # checkfirst:判斷表是否存在,如果存在,就不重復創(chuàng)建
          Base.metadata.create_all(engine,?checkfirst=True)

          #?實例化會話
          self.session?=?sessionmaker(bind=engine)()
          這樣所有的準備工作已經完成,接下來可以進行增刪改查操作了
          1、新增
          新增操作同樣包含插入一條記錄和多條記錄,分別對應會話對象的 add()、add_all() 方法
          對于一條記錄的新增操作,只需要實例化一個?People 對象,執(zhí)行上面的會話對象的 add(instance) 和?commit()?兩個方法,即可以將數據插入到數據表中
          def?add_item(self):
          ????"""
          ????新增
          ????:return:
          ????"""

          ????#?實例化一個對象
          ????people?=?People(name='xag',?age=23)
          ????self.session.add(people)

          ????#?提交數據才會生效
          ????self.session.comit()
          如果需要一次插入多條數據,只需要調用 add_all(列表數據)?即可
          def?add_items(self):
          ????"""
          ????新增多條記錄
          ????:return:
          ????"""

          ????datas?=?[
          ????????People(name='張三',?age=20),
          ????????People(name='李四',?age=21),
          ????????People(name='王五',?age=22),
          ????]
          ????self.session.add_all(datas)

          ????self.session.commit()
          2、查詢
          查詢數據表的操作對應會話對象的 query(可變參數)
          方法中的參數指定要查詢的字段值,還可以通過?all()、first()?級聯方法限制要查詢的數據
          def?query(self):
          ????"""
          ????查詢
          ????:return:
          ????"""

          ????#?查詢所有記錄
          ????#?result?=?self.session.query(People).all()

          ????#?查詢name/age兩個字段
          ????result?=?self.session.query(People.name,?People.age).all()
          ????print(result)
          當然,也可以利用?filter_by(條件),按條件進行過濾
          #?條件查詢
          resp?=?self.session.query(People).filter_by(name='xag').first()
          print(resp)
          3、更新
          更新操作一般做法是:
          • query 查詢出待更新的對象

          • 直接更新對象中的數據

          • 使用會話對象提交修改,完成更新操作

          def?update1(self,?id):
          ????"""
          ????更新數據1
          ????:return:
          ????"""

          ????#?獲取數據
          ????temp_people?=?self.session.query(People).filter_by(id=id).first()

          ????#?更新數據
          ????temp_people.name?=?"星安果"
          ????temp_people.age?=?18
          ????#?提交修改
          ????self.session.commit()
          需要指出的是,這里可以使用 update() 方法進行簡寫
          def?update2(self,?id):
          ????"""
          ????更新數據2
          ????:param?id:
          ????:return:
          ????"""

          ????#?使用update()方法直接更新字段值
          ????self.session.query(People).filter(People.id?==?id).update({People.name:?"xag",?People.age:?1})
          ????self.session.commit()
          4、刪除
          刪除操作對應 delete() 方法,同樣是先查詢,后刪除,最后提交會話完成刪除操作
          以按照 id 刪除某一條記錄為例:
          def?del_by_id(self,?id):
          ????"""
          ????通過id刪除一條記錄
          ????:param?id:
          ????:return:
          ????"""

          ????del_count?=?self.session.query(People).filter(People.id?==?id).delete()
          ????print('刪除數目:',?del_count)
          ????self.session.commit()

          5.最后

          本篇文章通過一張表的增刪改查,詳細講解了 Python 操作 Mysql 的兩種使用方式
          在實際項目中,如果僅僅是簡單的爬蟲或者自動化,建議使用 PyMysql;否則建議直接上 SQLAlchemy,它更強大方便
          我已經將文中全部源碼上傳到后臺,關注AirPython公眾號后回復「 dball?」即可獲得全部源碼
          如果你覺得文章還不錯,請大家?點贊、分享、留言?下,因為這將是我持續(xù)輸出更多優(yōu)質文章的最強動力!


          推薦閱讀


          阿里徹底拆中臺了!

          萬萬沒想到,“紅孩兒” 竟然做了程序員,還是 CTO!

          95 后程序員月薪 2 萬背著電腦送外賣,送單途中改 Bug



          進擊的Coder」,一起進步~
          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆成人传媒网,一区二区三区四区 | 成人网站十八禁 | 日韩无码三级片免费播放 | 18禁片在线网站 | www.avshipin |