数据库实践
一、python操作數據庫學習筆記
1、DB-API
1.1、Python的DB-API,為大多數的數據庫實現了接口,使用它連接各數據庫后,就可以用相同的方式操作各數據庫。
1.2、Python DB-API的使用流程:
- 引入API模塊
- 獲取與數據庫的連接
- 執(zhí)行sql語句和存儲過程
- 關閉數據庫連接
2、MySQL的安裝
?
為了用DB-API編寫MySQL腳本,必須確保已經安裝了MySQL。復制以下代碼,并執(zhí)行:
?
#!/usr/bin/python # -*- coding: UTF-8 -*-import MySQLdb?
如果執(zhí)行后的輸出結果如下所示,意味著你沒有安裝 MySQLdb 模塊:
?
Traceback (most recent call last): File "test.py", line 3, in <module> import MySQLdb ImportError: No module named MySQLdb?
?
安裝MySQLdb,請訪問?http://sourceforge.net/projects/mysql-python?,(Linux平臺可以訪問:https://pypi.python.org/pypi/MySQL-python)從這里可選擇適合您的平臺的安裝包,分為預編譯的二進制文件和源代碼安裝包。
?
如果您選擇二進制文件發(fā)行版本的話,安裝過程基本安裝提示即可完成。如果從源代碼進行安裝的話,則需要切換到MySQLdb發(fā)行版本的頂級目錄,并鍵入下列命令:
?
$ gunzip MySQL-python-1.2.2.tar.gz $ tar -xvf MySQL-python-1.2.2.tar $ cd MySQL-python-1.2.2 $ python setup.py build $ python setup.py install注意:請確保您有root權限來安裝上述模塊。
?
?3、?數據庫連接
連接數據庫前,請先確認以下事項:連接數據庫TESTDB使用的用戶名為 "testuser" ,密碼為 "test123",你可以可以自己設定或者直接使用root用戶名及其密碼。
以下實例鏈接Mysql的TESTDB數據庫,對應了DB-API的四個步驟:#?encoding: utf-8
# 1 引入API模塊 import MySQLdb# 2 獲取與數據庫的連接 # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 3 執(zhí)行SQL語句和存儲過程 # 使用cursor()方法獲取操作游標 cursor = db.cursor() # 使用execute方法執(zhí)行SQL語句 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法獲取一條數據庫。 data = cursor.fetchone() print "Database version : %s " % data# 4 關閉數據庫連接 # 關閉數據庫連接 db.close()執(zhí)行結果顯示:
Database version : 5.0.45?
4、 創(chuàng)建數據庫表
我們嘗試建立一個自定義的數據庫表:
數據庫表名稱:EMPLOYEEEMPLOYEE
數據表字段為:FIRST_NAME,LAST_NAME,AGE,SEX 和 INCOME。
# encoding: utf-8 import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # 如果數據表已經存在使用 execute() 方法刪除表。 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 創(chuàng)建數據表SQL語句 sql = """CREATE TABLE EMPLOYEE (FIRST_NAME CHAR(20) NOT NULL,LAST_NAME CHAR(20),AGE INT, SEX CHAR(1),INCOME FLOAT )""" cursor.execute(sql) # 關閉數據庫連接 db.close()5 、插入數據操作
使用SQL INSERT 語句向數據庫表 EMPLOYEE 插入記錄:
? ??
# encoding: utf-8 import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 插入語句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME, AGE, SEX, INCOME)VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try:# 執(zhí)行sql語句 cursor.execute(sql)# 提交到數據庫執(zhí)行 db.commit() except:# Rollback in case there is any error db.rollback() # 關閉數據庫連接 db.close()在這里提幾個重要的點:
1) 請 注意一定要有conn.commit()這句來提交事務,要不然不能真正的插入數據。
2)dollback()是回滾操作,回滾(Rollback)指的是程序或數據處理錯誤,將程序或數據恢復到上一次正確狀態(tài)的行為。回滾包括程序回滾和數據回滾等類型。
?
6 數據庫查詢操作
Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。
- fetchone(): 該方法獲取下一個查詢結果集。結果集是一個對象
- fetchall(): 接收全部的返回結果行.
- rowcount: 這是一個只讀屬性,并返回執(zhí)行execute()方法后影響的行數。
查詢EMPLOYEE表中salary(工資)字段大于1000的所有數據:
# encoding: utf-8 import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 查詢語句 sql = "SELECT * FROM EMPLOYEE \WHERE INCOME > '%d'" % (1000) try:# 執(zhí)行SQL語句 cursor.execute(sql)# 獲取所有記錄列表results = cursor.fetchall()for row in results:fname = row[0]lname = row[1]age = row[2]sex = row[3]income = row[4]# 打印結果print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \(fname, lname, age, sex, income ) except:print "Error: unable to fecth data" # 關閉數據庫連接 db.close()執(zhí)行結果顯示:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000?
7 、數據庫更新操作
更新操作用于更新數據表的的數據,以下實例將 TESTDB表中的 SEX 字段全部修改為 'M',AGE 字段遞增1:
# encoding: utf-8 import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 更新語句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1WHERE SEX = '%c'" % ('M') try:# 執(zhí)行SQL語句 cursor.execute(sql)# 提交到數據庫執(zhí)行 db.commit() except:# 發(fā)生錯誤時回滾 db.rollback() # 關閉數據庫連接 db.close()8 常用函數
下面總結一下常用的函數:
1) Connect()?方法用于創(chuàng)建數據庫的連接,里面可以指定參數:用戶名,密碼,主機等信息。這只是連接到了數據庫,要想操作數據庫需要創(chuàng)建游標。
2)commit() 提交
3)rollback() 回滾
4)cursor用來執(zhí)行命令的方法:
callproc(self, procname, args):用來執(zhí)行存儲過程,接收的參數為存儲過程名和參數列表,返回值為受影響的行數
execute(self, query, args):執(zhí)行單條sql語句,接收的參數為sql語句本身和使用的參數列表,返回值為受影響的行數
executemany(self, query, args):執(zhí)行單挑sql語句,但是重復執(zhí)行參數列表里的參數,返回值為受影響的行數
nextset(self):移動到下一個結果集
5)cursor用來接收返回值的方法:
fetchall(self):接收全部的返回結果行.
fetchmany(self, size=None):接收size條返回結果行.如果size的值大于返回的結果行的數量,則會返回cursor.arraysize條數據.
fetchone(self):返回一條結果行.
6)scroll(self, value, mode='relative'):移動指針到某一行.如果mode='relative',則表示從當前所在行移動value條,如果 mode='absolute',則表示從結果集的第一行移動value條.
二、建立數據庫
1、要求:
?
2、實操:
a、把文件寫入數據庫
代碼如下:
# -*- coding: utf-8 -*- """ Created on Sun Jun 2 12:07:50 2019@author: Amao """import sqlite3 import openpyxl #import pandas as pd lists=sqlite3.connect('D:/python/MyDatabase.db') c=lists.cursor() #c.execute('''CREATE TABLE rankg("序號","排名","學校名稱","省市","總分","生源質量","培養(yǎng)結果","科研規(guī)模","科研質量","頂尖成果","頂尖人才","科技服務","產學研合作","成果轉化")''') #import pandas as pd#def csv_to_xlsx_pd(): #csv = pd.read_csv('D:/python/CrawUniv.csv', encoding='gbk') #csv.to_excel('D:/python/CrawUniv.xlsx', sheet_name='data') listinsheet=openpyxl.load_workbook(r'D:/我的文件/Python作業(yè)/CrawUniv.xlsx') datainlist=listinsheet.active #獲取excel文件當前表格 data_truck=('''INSERT INTO rankg("序號","排名","學校名稱","省市","總分","生源質量","培養(yǎng)結果","科研規(guī)模","科研質量","頂尖成果","頂尖人才","科技服務","產學研合作","成果轉化") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)''') for row in datainlist.iter_rows(min_row=2,max_col=14,max_row=datainlist.max_row): #使excel各行數據成為迭代器cargo=[cell.value for cell in row] #敲黑板!!使每行中單元格成為迭代器c.execute(data_truck,cargo) #敲黑板!寫入一行數據到數據庫中表rankf for row in c.execute('SELECT * FROM rankg ORDER BY "序號"'):print(row)lists.commit() lists.close()結果:
?
轉載于:https://www.cnblogs.com/1234ai/p/10965674.html
總結
- 上一篇: 2019年六月刷题列表
- 下一篇: linux cmake编译源码,linu