Python語言實(shí)用教程第11章-數(shù)據(jù)庫應(yīng)用課件_第1頁
Python語言實(shí)用教程第11章-數(shù)據(jù)庫應(yīng)用課件_第2頁
Python語言實(shí)用教程第11章-數(shù)據(jù)庫應(yīng)用課件_第3頁
Python語言實(shí)用教程第11章-數(shù)據(jù)庫應(yīng)用課件_第4頁
Python語言實(shí)用教程第11章-數(shù)據(jù)庫應(yīng)用課件_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第11章 數(shù)據(jù)庫應(yīng)用一般高級語言都支持?jǐn)?shù)據(jù)庫操作,Python對多種數(shù)據(jù)庫操作提供了很好的支持。Python語言標(biāo)準(zhǔn)數(shù)據(jù)庫接口為Python DB-API,Python DB-API為開發(fā)人員提供了一致的數(shù)據(jù)庫應(yīng)用編程接口。本章主要內(nèi)容包括:數(shù)據(jù)庫基本知識、Python數(shù)據(jù)庫編程技術(shù)、多種數(shù)據(jù)庫操作模塊的介紹與基本使用等內(nèi)容。第11章 數(shù)據(jù)庫應(yīng)用學(xué)習(xí)重點(diǎn)或難點(diǎn): 關(guān)系數(shù)據(jù)庫與SQL語言 Python數(shù)據(jù)庫編程簡介 通過DB-API訪問數(shù)據(jù)庫 Python數(shù)據(jù)庫編程實(shí)例學(xué)習(xí)本章后,將能利用Python數(shù)據(jù)庫訪問技術(shù)來編寫數(shù)據(jù)庫應(yīng)用程序,實(shí)現(xiàn)對信息的高級管理功能。第11章 數(shù)據(jù)庫應(yīng)用11.1 關(guān)系

2、數(shù)據(jù)庫概述11.2 Python數(shù)據(jù)庫編程概述11.3 Python與ODBC11.4 Python與SQLite311.5 Python與MySQL11.6 Python與SQL Server11.1 關(guān)系數(shù)據(jù)庫概述 從知識的完整性角度考慮,本節(jié)簡單介紹關(guān)系數(shù)據(jù)庫的基本知識。主要是關(guān)系數(shù)據(jù)庫的定義及關(guān)系數(shù)據(jù)庫的國際標(biāo)準(zhǔn)SQL語言。11.1.1 關(guān)系數(shù)據(jù)庫數(shù)據(jù)庫(Database)是指長期存儲在計(jì)算機(jī)內(nèi)的、有組織的、可共享的數(shù)據(jù)集合。數(shù)據(jù)以記錄(Record)和字段(Field)的形式存儲在數(shù)據(jù)表(Table)中,由若干個(gè)相關(guān)聯(lián)的數(shù)據(jù)表構(gòu)成一個(gè)數(shù)據(jù)庫。數(shù)據(jù)庫國際標(biāo)準(zhǔn)操作語言SQL語言的操作對象

3、主要是數(shù)據(jù)表或視圖。SQL語言可分為:數(shù)據(jù)定義語言DDL、數(shù)據(jù)操縱語言DML、數(shù)據(jù)查詢語言DQL和數(shù)據(jù)控制語言DCL四大類。11.1.2 SQL語言1.創(chuàng)建數(shù)據(jù)表CREATE TABLE 表名(字段名l 數(shù)據(jù)類型 列級約束條件,字段名2 數(shù)據(jù)類型 列級約束條件,字段名n 數(shù)據(jù)類型 列級約束條件 , 表級完整性約束)創(chuàng)建學(xué)生信息表studentcreate table student(sno char(10) primary key,sname char(20),sage integer,sdept char(10)11.1.2 SQL語言 2.修改數(shù)據(jù)表 ALTER TABLE 表名 ADD

4、字段名 數(shù)據(jù)類型 約束條件 在學(xué)生表student中添加一個(gè)性別字段ssex其SQL語句為: ALTER TABLE student add ssex char(2) not null 刪除字段使用的格式為:ALTER TABLE 表名 DROP 字段名 在學(xué)生信息表student中刪除一個(gè)字段性別ssex其SQL語句為: ALTER TABLE student DROP ssex11.1.2 SQL語言3.刪除數(shù)據(jù)表 在SQL語言中使用DROP TABLE語句刪除某個(gè)表格及表格中的所有記錄,其命令格式為:DROP TABLE 表名 在test數(shù)據(jù)庫中刪除學(xué)生表student其SQL語句為:D

5、ROP TABLE student11.1.2 SQL語言4.向數(shù)據(jù)表中插入數(shù)據(jù) INSERT語句實(shí)現(xiàn)向數(shù)據(jù)庫表格中插入或增加新的數(shù)據(jù)行,其格式如下: INSERT INTO 表名(字段名l,字段名n) VALUES(值l,值n) 例如:在學(xué)生表student中插入一條記錄,其SQL語句為: insert into student(sno,sname,sage,sdept) values(20160305,董華,19, cs)11.1.2 SQL語言5.數(shù)據(jù)更新語句 UPDATE語句實(shí)現(xiàn)更新或修改滿足規(guī)定條件的現(xiàn)有記錄,使用格式如下: UPDATE 表名 SET 字段名l=新值l ,字段名2=

6、新值2 WHERE 條件表達(dá)式 例如:學(xué)生表student中的sage加1歲,其SQL語句為:Update student set sage=sage+111.1.2 SQL語言6.刪除記錄語句 DELETE語句刪除數(shù)據(jù)庫表格中的行或記錄,其命令格式如下: DELETE FROM 表名 WHERE 條件表達(dá)式 例如:刪除學(xué)生表student中的sage字段的值超過24的記錄,其語句為: DELETE FROM student where sage2411.1.2 SQL語言7.數(shù)據(jù)查詢語言 最基本的SELECT查詢語句格式: SELECT DISTINCT 字段名l,字段名2, FROM 表名

7、 WHERE 條件表達(dá)式 例如查詢出學(xué)生表student中的所有姓王的學(xué)生信息,其語句為: Select * from student where sname like 王%11.2 Python數(shù)據(jù)庫編程概述 關(guān)系型數(shù)據(jù)庫擁有共同的規(guī)范Python Database API Specification V2.0(Python DB-API),MySQL、Oracle等都實(shí)現(xiàn)了此規(guī)范,然后增加自己的擴(kuò)展。為了增強(qiáng)自己數(shù)據(jù)庫操作的性能與效率等,不同數(shù)據(jù)庫還會提供操作自己數(shù)據(jù)庫的專門接口模塊。 sqlite3:sqlite3模塊提供了SQLite數(shù)據(jù)庫訪問的接口。SQLite數(shù)據(jù)庫是以一個(gè)文件或內(nèi)

8、存的形式存在的自包含的關(guān)系型數(shù)據(jù)庫。11.2 Python數(shù)據(jù)庫編程概述 DBM-style數(shù)據(jù)庫模塊:python提供了多個(gè)modules來支持UNIX DBM-style數(shù)據(jù)庫文件。dbm模塊用來讀取標(biāo)準(zhǔn)的UNIX-dbm數(shù)據(jù)庫文件;gdbm用來讀取GNU dbm數(shù)據(jù)庫文件;dbhash用來讀取Berkeley DB數(shù)據(jù)庫文件。所有的這些模塊提供了一個(gè)對象實(shí)現(xiàn)了基于字符串的持久化的字典,它與字典dict非常相似,但是它的keys和values都必須是字符串。11.2 Python數(shù)據(jù)庫編程概述 這里主要介紹Python標(biāo)準(zhǔn)數(shù)據(jù)庫接口(Python DB-API)。Python DB-API

9、為開發(fā)人員提供了數(shù)據(jù)庫應(yīng)用編程接口。DB-API是一個(gè)規(guī)范,它定義了一系列必須的對象和數(shù)據(jù)庫存取方式,以便為各種各樣的底層數(shù)據(jù)庫系統(tǒng)和多種多樣的數(shù)據(jù)庫接口程序提供一致的訪問接口。11.2 Python數(shù)據(jù)庫編程概述 Python 數(shù)據(jù)庫接口支持非常多的數(shù)據(jù)庫,可以選擇適合你項(xiàng)目的數(shù)據(jù)庫:GadFly、mSQL、MySQL、PostgreSQL、Microsoft SQL Server、Informix、Interbase、Oracle、Sybase等??梢栽L問Python數(shù)據(jù)庫接口及API查看詳細(xì)的支持?jǐn)?shù)據(jù)庫列表。11.2 Python數(shù)據(jù)庫編程概述 不同的數(shù)據(jù)庫需要下載不同的DB-API模塊

10、,例如需要訪問Oracle數(shù)據(jù)庫和Mysql數(shù)據(jù),你需要下載Oracle和MySQL數(shù)據(jù)庫DB-API模塊。Python的DB-API,為大多數(shù)的數(shù)據(jù)庫實(shí)現(xiàn)了接口,使用它連接各數(shù)據(jù)庫后,就可以用相同的方式操作各種數(shù)據(jù)庫。 Python DB-API使用流程:1)引入DB-API 模塊;2)獲取與數(shù)據(jù)庫的連接;3)執(zhí)行SQL語句和存儲過程;4)關(guān)閉數(shù)據(jù)庫連接。11.3 Python與ODBC pyodbc封裝了ODBC API,通過它可以訪問各種有ODBC驅(qū)動(dòng)的數(shù)據(jù)庫。Pyodbc提供的相關(guān)對象方法說明如下:1、connection 對象方法 1)close():關(guān)閉數(shù)據(jù)庫; 2)commit(

11、):提交當(dāng)前事務(wù); 3)rollback():取消當(dāng)前事務(wù); 4)cursor():獲取當(dāng)前連接的游標(biāo); 5)errorhandler():作為已給游標(biāo)的句柄。 2.cursor游標(biāo)對象和方法(具體略)11.3 Python與ODBC 【例11-1】 查詢某個(gè)ODBC數(shù)據(jù)源的某個(gè)表#encoding=gbkimport pyodbc, sys#conn= pyodbc.connect(DSN=mysqldsn;UID=root;PWD=root) # 連接MySQL#conn= pyodbc.connect(DRIVER=MySQL ODBC 5.3 ANSI Driver;SERVER=lo

12、calhost;PORT=3306;DATABASE=Jxgl;USER=root;PASSWORD=root)#conn= pyodbc.connect(DRIVER=MySQL ODBC 5.3 Unicode Driver;SERVER=localhost;PORT=3306;DATABASE=Jxgl;USER=root;PASSWORD=root)conn = pyodbc.connect(DRIVER=SQL Server;DATABASE=%s;SERVER=%s;UID=%s;PWD=%s%(Jxgl, , sa, sasasasa) # 連接SQL Servercursor=

13、conn.cursor()cursor.execute(SELECT * FROM student)while True: row=cursor.fetchone() if not row: break print(row)cursor.close()conn.close()11.4 Python與SQLite3 sqlite3是一個(gè)很優(yōu)秀的輕量級數(shù)據(jù)庫。sqlite3從Python 2.5版本開始加入到標(biāo)準(zhǔn)庫中。通過它,可以很方便地操作SQLite數(shù)據(jù)庫。操作SQLite數(shù)據(jù)庫的方法或語句與上面操作ODBC數(shù)據(jù)源數(shù)據(jù)的基本相同。下面直接舉例說明: 【例11-2】 創(chuàng)建一個(gè)內(nèi)存數(shù)據(jù)庫,建表并插

14、入記錄后,再顯示出來import sqlite3conn=sqlite3.connect(:memory:)cursor=conn.cursor()cursor.execute(CREATE TABLE person (name text, age int)cursor.execute(INSERT INTO person VALUES (TOM,20)cursor.execute(INSERT INTO person VALUES (Jhon,22)mit()cursor.execute(SELECT * FROM person)while True: row=cursor.fetchone

15、() if not row: break print(row)cursor.close(); conn.close()11.5 Python與MySQL Python和MySQL交互的模塊有 MySQLdb和PyMySQL(pymysql)等。Python操作MySQL數(shù)據(jù)庫的方法首先可選MySQL for Python,即MySQLdb,原因是這個(gè)是C寫的,速度快。MySQLdb是用于Python連接Mysql數(shù)據(jù)庫的接口,它實(shí)現(xiàn)了 Python 數(shù)據(jù)庫 API 規(guī)范V2.0,是基于 MySQL C API上建立的。但Python3不再支持MySQLdb。若想在Linux和Windows中都

16、同時(shí)能夠運(yùn)行,恐怕更得考慮采用PyMySQL。11.5 Python與MySQL PyMySQL是一個(gè)全Python寫的Python操作MySQL數(shù)據(jù)庫的第三方庫。使用時(shí)可以把它放入代碼工程中調(diào)用,當(dāng)然也可以在系統(tǒng)里先安裝后使用。PyMySQL的性能和MySQLdb幾乎相當(dāng),如果對性能要求不是特別的強(qiáng),使用PyMySQL將更加方便。 PyMySQL的使用方法和MySQLdb幾乎一樣,如果你以前使用過MySQLdb,只需要將import MySQLdb修改為 import pymysql就可以了。11.5.2 使用MySQLdb操M(fèi)ySQL 1、數(shù)據(jù)庫連接 連接數(shù)據(jù)庫前,請先確認(rèn)以下事項(xiàng):1)已

17、經(jīng)創(chuàng)建了數(shù)據(jù)庫,如:Company。2)在Company數(shù)據(jù)庫中已經(jīng)創(chuàng)建了表 EMPLOYEE。EMPLOYEE表字段有:FIRST_NAME,LAST_NAME,AGE,SEX和INCOME。3)連接數(shù)據(jù)庫Company使用的用戶名為testuser,密碼為test123,也可自己設(shè)定或者直接使用root用戶名及其密碼,Mysql數(shù)據(jù)庫用戶授權(quán)請使用Grant命令。4)在機(jī)器上已經(jīng)安裝了Python MySQLdb 模塊。11.5.2 使用MySQLdb操M(fèi)ySQL 2、創(chuàng)建數(shù)據(jù)庫表 如果數(shù)據(jù)庫連接存在,可以使用execute()方法來為數(shù)據(jù)庫創(chuàng)建表。 【例11-4】 創(chuàng)建表EMPLOYEE

18、。import MySQLdb db = MySQLdb.connect(localhost,root,root,Company)cursor = db.cursor() # 使用cursor()方法獲取操作游標(biāo)# 如果數(shù)據(jù)表已經(jīng)存在使用 execute()方法刪除表。cursor.execute(DROP TABLE IF EXISTS EMPLOYEE)11.5.2 使用MySQLdb操M(fèi)ySQL# 創(chuàng)建數(shù)據(jù)表SQL語句sql = CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE IN

19、T, SEX CHAR(1), INCOME FLOAT )cursor.execute(sql)db.close() # 關(guān)閉數(shù)據(jù)庫連接11.5.2 使用MySQLdb操M(fèi)ySQL 3、數(shù)據(jù)庫插入操作 以下例題使用執(zhí)行 SQL INSERT 語句向表 EMPLOYEE 插入記錄:【例11-5】 在EMPLOYEE表中添加記錄。import MySQLdbdb = MySQLdb.connect(localhost,root,root,Company)cursor = db.cursor()sql = INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME, AGE

20、, SEX, INCOME)11.5.2 使用MySQLdb操M(fèi)ySQL VALUES (Mac, Mohan, 20, M, 2000) # SQL 插入語句 try: cursor.execute(sql) # 執(zhí)行sql語句 mit() # 提交到數(shù)據(jù)庫執(zhí)行 except: db.rollback() # 執(zhí)行中遇到錯(cuò)誤回滾前面已做的操作 db.close()11.5.2 使用MySQLdb操M(fèi)ySQL 以上例子中的SQL語句也可以寫成如下形式:sql = INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME,AGE,SEX,INCOME) VALUES (

21、%s, %s, %d, %c, %d ) % (Mac, Mohan, 20, M, 2000) # SQL 插入語句 以下代碼使用變量向SQL語句中傳遞參數(shù):user_id = root; password = rootcon.execute(insert into Login values(%s,%s) % (user_id,password)11.5.2 使用MySQLdb操M(fèi)ySQL 4、數(shù)據(jù)庫查詢操作 Python查詢Mysql使用 fetchone()方法獲取單條數(shù)據(jù),使用fetchall()方法獲取多條數(shù)據(jù)。說明:1)fetchone():該方法獲取下一個(gè)查詢結(jié)果集。結(jié)果集是一個(gè)

22、對象。2)fetchall():接收全部的返回結(jié)果行。3)rowcount:這是一個(gè)只讀屬性,并返回執(zhí)行execute()方法后影響的行數(shù)。11.5.2 使用MySQLdb操M(fèi)ySQL 【例11-6】 查詢EMPLOYEE表中salary(工資)字段大于1000的所有數(shù)據(jù)。import MySQLdb # 打開連接db = MySQLdb.connect(localhost,root,root,Company) cursor = db.cursor() # 使用cursor()方法獲取操作游標(biāo)sql = SELECT * FROM EMPLOYEE WHERE INCOME %d % (100

23、0)11.5.2 使用MySQLdb操M(fèi)ySQL try: cursor.execute(sql) results = cursor.fetchall() # 獲取所有記錄列表 for row in results: fname = row0;lname = row1; age = row2; sex = row3; income = row4 print(fname=%s,lname=%s,age=%d,sex=%s,income=%d % (fname, lname, age, sex, income ) # 打印結(jié)果 except: print(錯(cuò)誤: 不能獲取到數(shù)據(jù)。) db.clos

24、e() # 結(jié)果如下: fname=Mac,lname=Mohan,age=20,sex=M,income=200011.5.2 使用MySQLdb操M(fèi)ySQL 5、數(shù)據(jù)庫更新操作 更新操作用于更新數(shù)據(jù)表的的數(shù)據(jù),例如: 【例11-7】 將 EMPLOYEE表中所有記錄的SEX 字段改為M,AGE 字段遞增1。 import MySQLdbdb=MySQLdb.connect(localhost,root,root,Company )cursor = db.cursor()11.5.2 使用MySQLdb操M(fèi)ySQLsql = UPDATE EMPLOYEE SET AGE=AGE + 1 W

25、HERE SEX=%c % (M)try: cursor.execute(sql); mit()except: db.rollback() # 發(fā)生錯(cuò)誤時(shí)回滾db.close()11.5.2 使用MySQLdb操M(fèi)ySQL 6、執(zhí)行事務(wù) 事務(wù)機(jī)制可以確保數(shù)據(jù)一致性。事務(wù)應(yīng)該具有4個(gè)屬性: 原子性、一致性、隔離性、持久性。這四個(gè)屬性通常稱為ACID特性?!纠?1-8】 基于事務(wù)機(jī)制實(shí)現(xiàn)記錄刪除的程序段。sql = DELETE FROM EMPLOYEE WHERE AGE %d % (20) # SQL刪除語句try: cursor.execute(sql) # 執(zhí)行SQL語句 mit() #

26、 向數(shù)據(jù)庫提交except: db.rollback() # 發(fā)生錯(cuò)誤時(shí)回滾11.5.3 PyMySQL的安裝 PyMySQL(pymysql)是一個(gè)純Python寫的MySQL客戶端,它的目標(biāo)是最終替代MySQLdb,可以在CPython、PyPy、IronPython和Jython環(huán)境下運(yùn)行,PyMySQL在MIT許可下發(fā)布。在開發(fā)基于Python語言的項(xiàng)目中,為了以后系統(tǒng)能兼容Python3,建議使用PyMySQL替換MySQLdb。 通過如下例子來說明使用PyMySQL操作mysql。 【例11-9】 對student表插入一條記錄。11.5.5 MySQL-connector安裝使用

27、Python與MySQL服務(wù)器通信,還可以使用MySQL-connector-python,一個(gè)Python模塊MySQL/Connector。試著使用pip安裝,若不行可到/downloads/connector/python/手動(dòng)下載,譬如下載unzip mysql-connector-python-2.1.3.zip后,解壓到mysql-connector-python-2.1.3目錄,進(jìn)入該目錄后,利用“sudo python setup.py install”來安裝。11.5.5 MySQL-connector安裝使用 安裝成功后,就可以在python程序里正常使用“import m

28、ysql.connector as mysql”導(dǎo)入MySQL的connector模塊了,使用也很簡單。 【例11-10】 一個(gè)簡單查詢一個(gè)數(shù)據(jù)表數(shù)據(jù)的實(shí)例。11.5.6 中文亂碼問題處理 通過Python查詢數(shù)據(jù)庫中數(shù)據(jù)時(shí),數(shù)據(jù)會呈現(xiàn)亂碼,只需要在連接字符串中指定數(shù)據(jù)編碼,如“utf8”、“GBK”等就可以。注意:Python 3.x才支持Unicode編碼。# -*- coding:gbk -*-import pymysqldb=pymysql.connect(host=localhost,user=root,password=root,database=Jxgl,charset=gbk)

29、cursor=db.cursor(); sqlstr=SELECT * FROM course;try: cursor.execute(sqlstr); courses=cursor.fetchall()except: print(u數(shù)據(jù)讀取錯(cuò)誤)else: print(courses)db.close()11.6 Python與SQL Server python連接微軟的SQL Server數(shù)據(jù)庫用的第三方模塊叫做pymssql(官方文檔:/en/stable/index.html)。 在官方文檔可以看到,pymssql是基于_mssql模塊做的封裝,是為了遵守python的DB-API規(guī)范接口。11.6 Python與SQL Server pymssql的安裝可以通過:pip install pymssql 或 pip3 install pymssql 另外,pymssql 2.1.3可由網(wǎng)址:/pypi/pymssql/2.1.3獲取。從該網(wǎng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論