1. 程式人生 > >【Python】 pymysql模組處理Mysql資料庫

【Python】 pymysql模組處理Mysql資料庫

PyMySQL 是在 Python3.x 版本中用於連線 MySQL 伺服器的一個庫,Python2中則使用mysqldb。
PyMySQL 遵循 Python 資料庫 API v2.0 規範,幷包含了 pure-Python MySQL 客戶端庫。
在使用 PyMySQL 之前,我們需要確保 PyMySQL 已安裝,可以直接pip安裝:pip install pymysql
本文主要介紹了pymysql連線資料庫;刪除、建立表;將資料儲存到資料庫;查詢資料庫資料輸出到excel

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#作者:cacho_37967865
#部落格:https://blog.csdn.net/sinat_37967865
#檔案:pymysqlModel.py
#日期:2018-10-22
#備註:pip install pymysql  pymysql是Python中操作MySQL的模組  
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

import pymysql
import time
import xlrd
from xlutils.copy import copy
import os

start_time = time.time()  #計算程式執行時間

db = pymysql.connect(
    host="localhost",
    user="root",
    password="123456",
    port=3306,
    use_unicode=True,
    charset="utf8",
    database="sunshine")

cursor = db.cursor()

def createTable():
    sql1 = 'drop table if exists save_amount;'
    sql2 = 'create table save_amount(No INT(11) NOT NULL AUTO_INCREMENT,billNo VARCHAR(50),amount FLOAT DEFAULT 0.0,PRIMARY KEY (No));'
    cursor.execute(sql1)
    cursor.execute(sql2)
    db.commit()


def get_excel_data(xlsFile):
    data = xlrd.open_workbook(xlsFile)
    table = data.sheets()[0]
    nrows = table.nrows
    sqlData = []
    # 獲取指定(第二B)列資料
    for i in range(1, nrows):
        billNo = table.cell_value(i, 1)
        try:
            billNo = int(billNo)
            billNo = str(billNo)

        except Exception as f:
            print(str(f))

        row = []
        if billNo != '' and (billNo[0:3] == '718' or billNo[0:3] == '444' or billNo[0:3] == '639'):
            row.append(billNo)
            row.append(0.0)
        else:
            continue              # 不符合要求就跳過
        sqlData.append(row)
    return sqlData


def data_to_mysql(billNo,amount):
    sql = "insert into save_amount(billNo,amount) values('%s','%f')" % (billNo,amount)
    try:
        # 使用 cursor() 方法建立一個遊標物件 cursor
        cursor.execute(sql)
    except Exception as e:
        # 發生錯誤時回滾
        db.rollback()
        print(str(e))
    else:
        db.commit()  # 事務提交
        print('事務處理成功')


# 將根據對賬單Excel中資料庫查詢的資訊copy到一個新的excel中(不能迴圈)
def mysql_to_excel(xlsFile,newFile):
    a = 1
    data = xlrd.open_workbook(xlsFile, formatting_info=True)
    table = data.sheets()[0]
    nrows = table.nrows
    new_excel = copy(data)
    ws = new_excel.get_sheet(0)

    for i in range(1, nrows):
        billNo = table.cell_value(i, 1)
        cursor.execute('select billNo,amount from save_amount where billNo=%s', (billNo))
        results = cursor.fetchall()  # 獲取多條資料

        # row_1 = cursor.fetchone()   # 獲取一條資料
        for i in range(len(results)):
            amount = results[i][1]
            print(a+1,billNo,amount)
            ws.write(a, 11, billNo)    # 12列L
            ws.write(a, 12, amount)    # 13列M
            a = a + 1
    new_excel.save(newFile)

''''''''
def main():
    createTable()      # 建立一個空白資料庫表
    sqlData = get_excel_data('F:\PythonProject\PythonLession\RecordModule\oct.xls')  # 獲取對賬單裡面不需要的運單
    for i in range(len(sqlData)):
        billNo = sqlData[i][0]
        amount = sqlData[i][1]
        data_to_mysql(billNo, amount)

    mysql_to_excel('F:\PythonProject\PythonLession\RecordModule\oct.xls', 'F:\PythonProject\PythonLession\RecordModule\oct1.xls')

    db.close()
''''''''''''''
if __name__ == '__main__':
    main()
    endtime = time.time() - start_time
    print('程式運行了%.2f秒' % endtime)

1.當我們需要傳參進入到sql語句時,使用方法如下:
sql = "insert into save_amount(billNo,amount) values('%s','%f')" % (billNo,amount)
%s表示欄位為str型別,%f表示欄位為float型別,傳參表示式:% (billNo,amount)
2.有時我們希望對原有的excel進行處理,可以複製一份excel在進行處理
from xlutils.copy import copy
data = xlrd.open_workbook(xlsFile, formatting_info=True)  # 開啟需要修改的excel
new_excel = copy(data)                                    # 複製資訊到新excel
ws = new_excel.get_sheet(0)                           # 獲取第一個sheet,到時候對這個sheet處理