(十一)Python 數(shù)據(jù)庫的操作

一验烧、訪問SQLite數(shù)據(jù)庫

  • SQLite是一個開源關(guān)系型數(shù)據(jù)庫,具有零配置(Zero Configuration)帅矗、自我包含(Self-contained)和便于傳輸(Easy Transfer)等優(yōu)點基协,由于其高度便攜,使用方便波势、結(jié)構(gòu)緊湊、高效和可靠,因此被廣泛用于移動設備嵌入式數(shù)據(jù)庫作為前端數(shù)據(jù)存儲清寇。SQLite支持規(guī)范的SQL(Structured Query Language,結(jié)構(gòu)化查詢語言),可方便地支持數(shù)據(jù)庫系統(tǒng)原型研發(fā)和移植护蝶。

  • SQLite將整個數(shù)據(jù)庫的表华烟、索引、數(shù)據(jù)都存儲在一個單一的.db文件中持灰,不需要網(wǎng)絡配置和管理垦江,沒有用戶賬戶和密碼,數(shù)據(jù)庫的訪問權(quán)限依賴于文件所在的操作系統(tǒng)搅方。這個小型的數(shù)據(jù)庫系統(tǒng)能夠支持事務比吭,具有原子性、一致性姨涡、隔離性和持久性衩藤,還能支持觸發(fā)器、復雜查詢涛漂,以及多進程并發(fā)訪問赏表。

  • 關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)存放于多個二維表中检诗,在表中,行稱為記錄(record),列稱為字段(field)瓢剿。

  • 一個數(shù)據(jù)庫中可以包含多個表逢慌。例如,在student.db數(shù)據(jù)庫中除包含基本情況表base外间狂,還包含成績表score等數(shù)據(jù)表攻泼。各表中都包含一個學號字段,通過學號可以建立兩個表乃至多個表之間的關(guān)聯(lián)關(guān)系鉴象,作為一個邏輯整體提供查詢應用忙菠。這樣,既避免了單個表之間龐大復雜纺弊,又增加了引用數(shù)據(jù)的靈活性牛欢,減少了數(shù)據(jù)的冗余。

  • 1.1淆游、SQLite數(shù)據(jù)庫連接對象及表的SQL操作
    SQLite3是Python的內(nèi)置庫傍睹,用import sqlite3 引用后,訪問SQLite數(shù)據(jù)庫通常需要經(jīng)歷如下的步驟:

    • connect()創(chuàng)建數(shù)據(jù)庫連接對象conn犹菱。
    • 若需要對表進行創(chuàng)建新表焰望、插入數(shù)據(jù)、修改或刪除數(shù)據(jù)操作已亥,可使用conn.execute()方法熊赖,并使用conn.commit()提交事務。
    • 若需要查詢操作虑椎,應先使用conn.cursor()方法返回游標對象 cur,然后通過執(zhí)行cur.execute()進行查詢震鹉。
    • 調(diào)用cur.fetchone()cur.fetchmany()cur.fetchall()方法返回查詢結(jié)果捆姜。
    • 最后關(guān)閉 curconn 對象传趾。

    connect()函數(shù)可建立對已有數(shù)據(jù)庫文件的鏈接對象(下例中的 conn),若不存在該數(shù)據(jù)庫文件,則新建該數(shù)據(jù)庫泥技。例如:在桌面建立一個空數(shù)據(jù)庫:test.db浆兰。

    屏幕快照 2018-08-29 下午9.54.29.png

    import sqlite3
    conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
    
    • 由于sqlite3不是可視化呈現(xiàn)的,因此可使用 Navicat for SQLite 珊豹、SQLite Expert簸呈、SQLite Studio、SQLiteTool等第三方工具協(xié)助管理數(shù)據(jù)庫店茶。

    • 建立數(shù)據(jù)庫對象后蜕便,用數(shù)據(jù)庫連接對象的 execute (SQL 語句)方法可執(zhí)行SQL語句,對數(shù)據(jù)庫及表實現(xiàn)創(chuàng)建贩幻、插入轿腺、修改两嘴、刪除和查詢操作。SQL語句大小寫不敏感族壳,可分行憔辫,關(guān)鍵字之間可使用空格。在Python字符串的三重引號定符'''的支持下仿荆,可將SQL語句分行呈現(xiàn)贰您,增加可讀性。

    • 成功創(chuàng)建數(shù)據(jù)庫后赖歌,應在其中合理的創(chuàng)建表枉圃。表結(jié)構(gòu)的設計是否合理功茴,對程序的運行效率至關(guān)重要庐冯。設計和創(chuàng)建表,主要應關(guān)注表中應包含哪些字段坎穿,每個字段的名字展父、數(shù)據(jù)類型和寬度。

    • SQLite3的表支持以下4種類型玲昧。

      • 整數(shù)型(INTEGEER): 有符號整數(shù)栖茉,按實際存儲大小自動存儲為1、2孵延、3吕漂、4、6或8字節(jié)尘应,通常不需要指定位數(shù)惶凝。
      • 實數(shù)型(REAL): 浮點數(shù),以8字節(jié)指數(shù)形式存儲犬钢,可指定總位數(shù)和小數(shù)位數(shù)苍鲜。
      • 文本型(TEXT): 字符串,以數(shù)據(jù)庫編碼方式存儲(以UTF-8 支持漢字)玷犹。
      • BLOB型: 二進制對象存儲混滔,通常用來保存圖片、視頻歹颓、XML等數(shù)據(jù)坯屿。

      創(chuàng)建表的語句的通式為:

      CREATE TABLE <表>(<字段元組>)
      

      SQL語句大小寫不敏感,但此處為與Python語句相區(qū)別巍扛,以大寫表示愿伴。設計表結(jié)構(gòu)時作為一種數(shù)據(jù)完整性約束,可指定某字段是否允許空电湘,若不允許為空隔节,可用 NOT NULL 關(guān)鍵字加以限制鹅经。在大多數(shù)表中,往往會指定一個非空且唯一的字段作為關(guān)鍵字(PRIMARY KRY,如學號)怎诫。為了便于快速檢索瘾晃,通常將表按主關(guān)鍵字建立索引。

      • 例如1幻妓、在桌面建立一個如下的數(shù)據(jù)庫 test.db

        學生基本情況表 base的數(shù)據(jù)結(jié)構(gòu)

        import sqlite3
        
        conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
        c = conn.cursor()
        c.execute('''CREATE TABLE base \
           (學號 TEXT(10) PRIMARY KEY  NOT NULL, \
            姓名 TEXT(10) NOT NULL,\
            性別 TEXT(1) NOT NULL,\
            專業(yè) TEXT(6),\
            生源 TEXT(6),\
            身高 INTEGER,\
            電話 TEXT(6) )''')
        conn.commit()
        conn.close()
        

        與數(shù)據(jù)庫鏈接對象conn.execute()方法相關(guān)的常用SQL語句通式如下:

        • 添加:

          INSERT INTO <表>(<字段元組>) VALUES (<數(shù)據(jù)元組>)
          
          如下:
          import sqlite3
          
          conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
          c = conn.cursor()
          
          print ("Opened database successfully")
          
          c.execute("INSERT INTO base (學號,姓名,性別,專業(yè),生源,身高,電話) \
                    VALUES ('20','王','男','電氣工程及其自動化','本科',178,'18500652890')")
          
          conn.commit()
          print ("Records created successfully")
          conn.close()
          
        • 修改:

          UPDATE <表> SET <字段>=<值>
          
        • 刪除:

          DELETE FROM <表> WHERE <條件表達式>
          
      • 例如2蹦误、編寫Python 程序為例1中創(chuàng)建的student 庫的base表添加新學生學號、姓名和性別三項非空數(shù)據(jù)肉津。

        base表中添加數(shù)據(jù)

        import sqlite3
        # 鏈接數(shù)據(jù)庫
        conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
        while True:
              id = input('請輸入新生學號:(輸入0退出程序)\n')
              if id == '0':
                   break
              name = input('請輸入新生的姓名:\n')
              gender = input('請輸入新生的性別:\n')
              # 格式化構(gòu)建 SQL 字符串
              SQL = '''insert into base \
                      (學號,姓名,性別) values ('%s','%s','%s')''' % (id,name,gender)
              # 插入數(shù)據(jù)
              conn.execute(SQL)
              # 提交事務
              conn.commit()
        
        conn.close()
        

        運行結(jié)果如下:

        請輸入新生學號:(輸入0退出程序)
        21
        請輸入新生的姓名:
        邵豪杰
        請輸入新生的性別:
        男
        請輸入新生學號:(輸入0退出程序)
        22
        請輸入新生的姓名:
        馬也
        請輸入新生的性別:
        女
        請輸入新生學號:(輸入0退出程序)
        

        在格式化構(gòu)建SQL字符串時應該注意强胰,values 后面的數(shù)據(jù)元組應與前面的表達字段元組順序一直,且TEXT類型的數(shù)據(jù)要加單引號界定符妹沙。

  • 1.2偶洋、游標對象和SQL查詢

    與游標對象 cur.execute() 方法相關(guān)的SQL語句通式為:

    SELECT [DISTINCT] <目標列表表達式> [AS <列名>]
    [,<目標列表達式> [AS <列名> ...] FROM <表名> [,<表名>...]
    [WHERE <條件表達式> [AND | OR <條件表達式>...]
    [GROUP BY 列名 [HAVING  <條件表達式>>
    [ORDER BY 列名 [ASC | DESC>
    

    其中DISTINCT表示不包括重復行;
    <目標列表達式>包含對目標列的 AVG距糖、COUNT玄窝、SUM、MIN悍引、MAX等聚合函數(shù)恩脂;
    <GROUP BY 列名> 為對聚合函數(shù)查詢的分組;
    [HAVING<條件表達式>] 為分組篩選的條件趣斤;
    [ORDER BY 列名 [ASC | DESC>表示對查詢結(jié)果的排序俩块,ASC 為升序(默認),DESC為降序浓领。
    執(zhí)行游標對象 cur.execute(<SELECT 查詢SQL語句>)后玉凯,用 cur.fetchall()或cur.fetchone() 可接收查詢結(jié)果。其中镊逝,cur.fetchall() 返回的是每條記錄為 一個元組作為列表元素的數(shù)據(jù)集列表壮啊,而cur.fetchone()則只返回第一條記錄的元組類型結(jié)果。

    • 例如3撑蒜、創(chuàng)建Python 程序?qū)η懊胬觿?chuàng)建的student 庫中根據(jù)所輸入的專業(yè)查詢學生學號歹啼、姓名和性別。


      base表
      import sqlite3
      conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
      while True:
          major = input('請輸入查詢專業(yè):(輸入0退出程序)\n')
          if major == '0':
              break
          SQL="SELECT * from base where 專業(yè)='%s'" % major
          cur = conn.execute(SQL)
          list1=cur.fetchall()
         print('學號 ',' 姓名 ',' 性別 ',' 專業(yè) ')
         for rec in list1:
              print(rec[0],rec[1],rec[2],rec[3])
      
      conn.close()
      

      運行的結(jié)果如下:

      請輸入查詢專業(yè):(輸入0退出程序)
      電氣工程及其自動化
      學號   姓名   性別   專業(yè) 
      20 王沖 男 電氣工程及其自動化
      4 李云東 女 電氣工程及其自動化
      請輸入查詢專業(yè):(輸入0退出程序)
      

二座菠、訪問Access狸眼、MySQL 和 SQLServer數(shù)據(jù)庫

Python 可支持訪問不同的數(shù)據(jù)庫。但由于不同的數(shù)據(jù)庫及其服務的通信協(xié)議各有不同浴滴,早期版本訪問不同數(shù)據(jù)庫需要不同的代碼支持拓萌,二Python DB-API作為 Python標準數(shù)據(jù)庫接口的誕生,為Python數(shù)據(jù)庫應用提供了標準的編程接口升略,支持MySQL 微王、PostgreSQL屡限、Microsoft SQL Server 、Oracle 炕倘、Sybase 等常用數(shù)據(jù)庫钧大。即使所需鏈接的數(shù)據(jù)庫底層服務協(xié)議不同,也能夠標準的DB-API 接口實現(xiàn)訪問罩旋。
利用微軟操作系統(tǒng)對各種數(shù)據(jù)庫驅(qū)動的開放數(shù)據(jù)庫連接接口(ODBC啊央,Open Database Connecttivity) 也可以實現(xiàn)對數(shù)據(jù)庫的標準訪問。通過標準的 DB-API 訪問各類數(shù)據(jù)庫通常如上節(jié)訪問 SQLite 一樣涨醋,也需經(jīng)歷如下步驟:

 1瓜饥、用connect創(chuàng)建數(shù)據(jù)庫連接對象 conn;
 2、如果需要對表進行創(chuàng)建浴骂、插入數(shù)據(jù)乓土、修改或刪除數(shù)據(jù)、可使用 conn.execute()方法靠闭,并使用conn.commit()提交事務帐我。
 3坎炼、如果需要查詢操作愧膀,應先使用 conn.cursor()方法返回游標對象 cur,然后通過執(zhí)行 cur.execute()進行查詢。
 4谣光、調(diào)用 cur.fetchone()檩淋、cur.fetchmany()或cur.fetchall()方法返回查詢結(jié)果。
 其中萄金,對不同類型的數(shù)據(jù)庫需要引用不同的標準庫蟀悦,用不同的語句創(chuàng)建鏈接對象。
  • 2.1氧敢、用 ODBC 創(chuàng)建鏈接對象
    對 Access 數(shù)據(jù)庫文件的訪問日戈,利用 Windows開放數(shù)據(jù)庫連接接口 ODBC 對文件、dBase孙乖、Foxpro浙炼、SQL Server 等微軟數(shù)據(jù)庫的訪問,均可預先在控制面板中建立 ODBC 數(shù)據(jù)源唯袄,如下:


    ODBC數(shù)據(jù)源

    預先安裝 pyodbc 庫 弯屈,然后用下列語句建立數(shù)據(jù)庫連接對象:

    import pyodbc
    conn= pyodbc.connect('DNS=student')
    
  • 2.2、對 MySQL 創(chuàng)建鏈接對象
    MySQL 數(shù)據(jù)庫是近來流行的開源關(guān)系型數(shù)據(jù)庫服務恋拷,對其建立連接對象可預先安裝 PyMySQL庫资厉,然后用下列語句創(chuàng)建:

    import pymysql
    conn= pymysql.connect(host=服務器地址或域名,port=3306,user='root',passwd=密碼,db=數(shù)據(jù)庫名字)
    
  • 2.3、對 MS SQL Server 創(chuàng)建鏈接對象
    MS SQL Server 數(shù)據(jù)庫是微軟主流的大型關(guān)系型數(shù)據(jù)庫服務蔬顾,對其建立連接對象可預先安裝 pymssql 庫 宴偿,然后用下列語句創(chuàng)建:

    import pymssql
    conn= pymssql.connect(host=<服務器地址或域名>,database=<數(shù)據(jù)庫名>,user=<用戶名>,password=<密碼>)
    

    數(shù)據(jù)庫連接對象建立后湘捎,對各類數(shù)據(jù)庫的訪問操作方法均與前面介紹的對SQLite的訪問操作類似。這里不再重復敘述窄刘。值的注意的是消痛,由于目前各類數(shù)據(jù)庫的編碼不統(tǒng)一,因此對中文查詢的支持尚不夠理想都哭。

  • 例如4秩伞、用Python 程序分別在 ODBC 鏈接的 student.db、MySQL數(shù)據(jù)庫 student(數(shù)據(jù)庫地址 192.168.145.253欺矫,root 密碼為test) 和 MS SQL Server 數(shù)據(jù)庫 student (數(shù)據(jù)庫地址 192.168.145.253纱新,sa 密碼為 123456)的base表中,查詢身高(height)181cm以上的學生學號穆趴、姓名和性別脸爱。

    # 1、用 obdc 連接數(shù)據(jù)庫(Access 等)
    # import pyodbc
    # conn=pyodbc.connect('DNS=student')
    
    # 2未妹、連接 MySQL 數(shù)據(jù)庫  
    import pymysql         
    conn=pymysql.connect(host='192.168.145.253',port=3306,user='root',passwd='test',db='base')
    
    # 3簿废、連接 MS SQL Server  數(shù)據(jù)庫
    
    # import pymssql
    # conn=pymssql.connect(host=".",database="student",user='sa',password='123456')
    
    cur = conn.cursor()
    cur.execute("SELECT * FROM BASE WHERE HEIGHT>181")
    list1=cur.fetchall()
    print('學號 ',' 姓名 ',' 性別 ',' 專業(yè)')
    for rec in list1:
       print(rec[0],rec[1],rec[2],rec[3])
    conn.close()
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市络它,隨后出現(xiàn)的幾起案子族檬,更是在濱河造成了極大的恐慌,老刑警劉巖化戳,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单料,死亡現(xiàn)場離奇詭異,居然都是意外死亡点楼,警方通過查閱死者的電腦和手機扫尖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掠廓,“玉大人换怖,你說我怎么就攤上這事◇扒疲” “怎么了沉颂?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黄橘。 經(jīng)常有香客問我兆览,道長,這世上最難降的妖魔是什么塞关? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任抬探,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘小压。我一直安慰自己线梗,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布怠益。 她就那樣靜靜地躺著仪搔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜻牢。 梳的紋絲不亂的頭發(fā)上烤咧,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音抢呆,去河邊找鬼煮嫌。 笑死,一個胖子當著我的面吹牛抱虐,可吹牛的內(nèi)容都是我干的昌阿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恳邀,長吁一口氣:“原來是場噩夢啊……” “哼懦冰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谣沸,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤刷钢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鳄抒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闯捎,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡椰弊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年许溅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉版。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贤重,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出清焕,到底是詐尸還是另有隱情并蝗,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布滚停,位于F島的核電站,受9級特大地震影響键畴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜起惕,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一涡贱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惹想,春花似錦、人聲如沸嘀粱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灌灾。三九已至,卻和暖如春悲柱,著一層夾襖步出監(jiān)牢的瞬間锋喜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工豌鸡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘿般,地道東北人涯冠。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蛇更,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子派任,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,928評論 2 89
  • 1.數(shù)據(jù)庫簡介 人類在進化的過程中掌逛,創(chuàng)造了數(shù)字师逸、文字豆混、符號等來進行數(shù)據(jù)的記錄,但是承受著認知能力和創(chuàng)造能力的提升皿伺,...
    大熊_7d48閱讀 523評論 0 1
  • 總有想不出穿什么的時候鸵鸥,建議可以選擇連衣裙哦奠滑,不用費心搭配,穿好了還能修飾身形养叛,真的是非常棒的單品呢。連衣裙真的是...
    shaohua小魚閱讀 200評論 0 0
  • WWH=Why-What-How 即 為了Why爽室,我們要做What,怎么做How淆攻。 例如 為了提升我的業(yè)務技能競爭...
    穆璃閱讀 232評論 0 0
  • 文/熠歆
    熠歆閱讀 176評論 12 2