介紹
今天我們學習如何通過Python操作MySQL數據庫。
在Python2.7下使用的是pymysql這個軟件包,跟著福哥來操作吧。
安裝pymysql
直接使用pip安裝即可
pip insall pymysql
授權
MySQL數據庫服務器默認只能在安裝了數據庫服務器的本機操作,也就是在TFLinux上操作,但是我們的python是安裝在TFWindows上的啊!所以,我們要授權任何電腦都可以操作TFLinux上的MySQL數據庫。當然了,肯定是需要正確的用戶名和密碼的啦!
在TFLinux上登錄mysql
[root@tfdev ~]# mysql -uroot -pabcdef
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.28 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
授權tfse用戶可以在任意電腦上連接MySQL數據庫服務器,且對數據庫tfse有完全控制權限
mysql> grant all on tfse.* to tfse@'%' identified by 'abcdef';
Query OK, 0 rows affected, 1 warning (0.02 sec)
建立MySQLDemo.py用來進行pymysql的測試
測試連接
寫入如下代碼,測試mysql的連接
import pymysql
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
如果沒有報錯,證明連接成功了!
測試寫入數據
寫入如下代碼,向websites表寫入一條數據
import pymysql
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# insert data into websites
cursor.execute("INSERT INTO websites (domainName, weight, createDT) VALUES (%s,%s,now())", ['tongfu.net', 1])
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
如果沒有報錯,就表示寫入成功了!
查看數據
到TFLinux上查看剛剛寫入的數據
mysql> select * from websites;
+-----------+------------+-------+----------+--------+---------------------+-------------+-------------+
| websiteId | domainName | title | descript | weight | createDT | lastFetchDT | nextFetchDT |
+-----------+------------+-------+----------+--------+---------------------+-------------+-------------+
| 3 | tongfu.net | NULL | NULL | 1 | 2020-10-08 12:47:12 | NULL | NULL |
+-----------+------------+-------+----------+--------+---------------------+-------------+-------------+
1 row in set (0.00 sec)
測試查詢數據
寫入如下代碼,查詢websites里的數據
import pymysql
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# query
cursor.execute("SELECT * FROM websites")
print ("總記錄數量:" + str(cursor.rowcount))
rows = cursor.fetchall()
print ("記錄信息")
for row in rows:
print row
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
接下來我們系統學習一下pymysql這個軟件包的功能
寫入操作
寫入操作包括很多,常見的命令包括:CREATE DATABASE/DROP DATABASE、CREATE TABLE/DROP TABLE/ALTER TABLE、INSERT INTO/UPDATE/DELETE等等。
寫入操作都需要通過pymysql的cursor.execute方法來運行,如果運行出現異常會拋出except,我們捕獲它進行后面的處理即可。
這里我們著重講講插入數據,更新數據,刪除數據的操作
插入單行數據
插入一行數據,強烈建議使用指定字段名稱的方式寫入數據
import pymysql
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# insert data into websites
cursor.execute("INSERT INTO websites (domainName, weight, createDT) VALUES (%s,%s,now())", ['www.tongfu.net', 1])
# websiteId of insert data
websiteId = cursor.lastrowid
print ("插入數據的websiteId是:" + str(websiteId))
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
插入多行數據
可以傳入數組到cursor.executemany實現多行數據插入的操作
import pymysql
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# insert data into websites
rows = [
('www.baidu.com',1),
('www.taobao.com',1),
('www.jd.com',1)
]
cursor.executemany("INSERT INTO websites (domainName, weight, createDT) VALUES (%s,%s,now())", rows)
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
更新數據
使用UPDATE語句進行數據的修改操作
import pymysql
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# insert data into websites
cursor.execute("UPDATE websites SET weight = 10 WHERE domainName = %s", 'tongfu.net')
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
刪除數據
使用DELETE語句刪除數據
import pymysql
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# insert data into websites
cursor.execute("DELETE FROM websites WHERE domainName = %s", 'www.baidu.com')
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
讀取操作
讀取操作只的就是SELECT語句了,這個SELECT語句可以有非常復雜的變化,設計到多表聯查的時候會更加復雜,有時候一個SQL語句幾千個字符都很正常。
讀取一行數據
通過cursor.fetchone讀取一行數據
import pymysql
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# insert data into websites
cursor.execute("SELECT * FROM websites WHERE domainName = %s", 'tongfu.net')
# fetch one
result = cursor.fetchone()
print result
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
讀取全部數據
通過cursor.fetchall讀取查詢結果集的全部數據
import pymysql
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# insert data into websites
cursor.execute("SELECT * FROM websites")
# fetch all
results = cursor.fetchall()
for result in results:
print result
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
數據分頁
所謂數據翻頁就是實現指定讀取數據的起始位置和讀取數據的條目數的技巧,通過這個技巧可以將一組數據均勻分成若干份,每一份相當于一頁,這樣的設計可以讓用戶像瀏覽圖書一樣的翻頁效果
import pymysql
import math
try:
# connection
cn = pymysql.connect("192.168.1.168","tfse","abcdef")
cursor = cn.cursor()
# select database
cn.select_db('tfse')
except Exception as e:
print e
exit()
try:
# insert data into websites
cursor.execute("SELECT * FROM websites")
# pages
cursor.scroll(0, mode="absolute") # move to 0
try:
# count page numbers
totalNum = cursor.rowcount
pageNum = 1
pageCount = math.ceil(float(totalNum)/3)
while 1:
# fetch 2 rows
results = cursor.fetchmany(2)
print ("頁碼:" + str(pageNum))
for result in results:
print result
# page number +1
pageNum = pageNum+1
# page number more than page count then break
if pageNum > pageCount:
break
except Exception as e:
print e
# commit
cn.commit()
except Exception as e:
print e
# rollback
cn.rollback()
finally:
# close
cursor.close()
cn.close()
今天我們學習了通過pymysql操作MySQL數據庫的方法,大家課后可以自己多多練習,一定要數量掌握這個技巧才可以哦~~
https://m.tongfu.net/home/35/blog/512799.html
基于Python+Django+MySQL+HTML的創新創業平臺
學生創新創業平臺是一個功能豐富的在線教育或協作系統,支持中文語言環境。它提供用戶管理、系統監控、多角色權限控制、資源管理、參數設置、字典管理、機構管理等多種功能,能夠滿足學生、教師和管理員等不同角色的需求。
用戶登錄,通過輸入用戶名和密碼登錄系統,頁面頂部有一個導航欄,包含幾個選項:首頁、創業比賽、創業社團、創業項目、政府政策、系統公告和系統管理
當前選中的是“創業比賽”頁面,用戶可以通過這個界面添加、編輯、查看和管理各種比賽的信息
當前選中的幾個創業社團的信息,表格中包含了以下信息,以下字段:序號、社團標題、狀態、指導老師、社團星級、參與人員、創建者和創建時間。
創業項目頁面,包括序號、項目標題、項目類型、狀態、參與人員、創建者和創建時間
當前選中的頁面是“政府政策”,下面列出了一些政策信息,包括序號、政策標題、創建人、創建時間和操作。
當前選中的功能模塊是“系統公告”,頁面中間部分展示了一個表格,列出了兩條公告信息,公告的標題,創建人,創建時間,并且也有“修改”和“刪除”的操作選項。
接下來是系統管理功能,包括“參數名稱”、“參數鍵名”、“參數鍵值”、“系統內置”、“備注”、“創建時間”和“操作”。
當前選中的是“登錄歷史”選項卡,下面列出了幾條登錄記錄,訪問編號,用戶名稱,登錄地址,類型,登錄日期。這些信息可以幫助管理員跟蹤誰在何時以何種方式訪問了該系統。
本項目在python3.7下通過測試,具體可以查看requirements中的環境要求,在這里出一個簡單的項目使用教程,一般項目中的requirements.txt中包含了項目的python依賴環境,在安裝好python的前提下只需要在cmd窗口中pip install -r requirements.txt 有時候因為路徑問題會提示requirements這個文件不存在,可以改為完整的路徑,比如c:\requirements.txt,對于本項目只需要運行python manage.py runserver,在pycharm的配置更為方便,可以不用每次都在終端輸入命令使用。
有需要的小伙伴可以通過后臺聯系方式獲取,如果加不上可以后臺留言留下聯系方式,不經常看后臺,但是看到了會回復的~,源碼獲取只收取很少的錢錢,除非是標記了For Free的。
ython連接并操作MySQL數據庫,主要通過Pymysql模塊實現。本節講解如何將抓取的數據存儲至MySQL數據庫。
首先您應該確定您的計算機上已經安裝了MySQL數據庫,然后再進行如下操作:
# 1. 連接到mysql數據庫
mysql -h127.0.0.1 -uroot -p123456
# 2. 建庫
create database maoyandb charset utf8;
# 3. 切換數據庫
use maoyandb;
# 4. 創建數據表
create table filmtab(
name varchar(100),
star varchar(400),
time varchar(30)
);123456789101112復制代碼類型:[python]
1)連接數據庫
db=pymysql.connect('localhost','root','123456','maoyandb')1復制代碼類型:[java]
參數說明:
localhost:本地MySQL服務端地址,也可以是遠程數據庫的IP地址。
root:連接數據所使用的用戶名。
password:連接數據庫使用的密碼,本機MySQL服務端密碼“123456”。
db:連接的數據庫名稱。
2)創建cursor對象
cursor=db.cursor()1復制代碼類型:[java]
3)執行sql命令
execute()方法用來執行SQL語句。如下所示:
#第一種方法:編寫sql語句,使用占位符傳入相應數據
sql="insert into filmtab values('%s','%s','%s')" % ('刺殺,小說家','雷佳音','2021')
cursor.excute(sql)
第二種方法:編寫sql語句,使用列表傳參方式
sql='insert into filmtab values(%s,%s,%s)'
cursor.execute(sql,['刺殺,小說家','雷佳音','2021'])123456復制代碼類型:[python]
4)提交數據
db.commit()
12復制代碼類型:[python]
5)關閉數據庫
cursor.close()
db.close()12復制代碼類型:[python]
完整的代碼如下所示:
# -*-coding:utf-8-*-
import pymysql
#創建對象
db=pymysql.connect('localhost','root','123456','maoyandb')
cursor=db.cursor()
# sql語句執性,單行插入
info_list=['刺殺,小說家','雷佳音,楊冪','2021-2-12']
sql='insert into movieinfo values(%s,%s,%s)'
#列表傳參
cursor.execute(sql,info_list)
db.commit()
# 關閉
cursor.close()
db.close()1234567891011121314復制代碼類型:[python]
查詢數據結果,如下所示:
mysql> select * from movieinfo;
+-------------+-------------------+-----------+
| name | star | time |
+-------------+-------------------+-----------+
| 刺殺,小說家 | 雷佳音,楊冪 | 2021-2-12 |
+-------------+-------------------+-----------+
1 rows in set (0.01 sec)1234567復制代碼類型:[python]
還有一種效率較高的方法,使用executemany()可以同時插入多條數據。示例如下:
db=pymysql.connect('localhost','root','123456','maoyandb',charset='utf8')
cursor=db.cursor()
# sql語句執性,列表元組
info_list=[('我不是藥神','徐崢','2018-07-05'),('你好,李煥英','賈玲','2021-02-12')]
sql='insert into movieinfo values(%s,%s,%s)'
cursor.executemany(sql,info_list)
db.commit()
# 關閉
cursor.close()
db.close()12345678910復制代碼類型:[python]
查詢插入結果,如下所示:
mysql> select * from movieinfo;
+-------------+-------------------+------------+
| name | star | time |
+-------------+-------------------+------------+
| 我不是藥神 | 徐崢 | 2018-07-05 |
| 你好,李煥英 | 賈玲 | 2021-02-12 |
+-------------+-------------------+------------+
2 rows in set (0.01 sec)12345678復制代碼類型:[python]
將抓取下來的數據存儲到MySQL數據庫。如下所示:
# coding=gbk
from urllib import request
import re
import time
import random
from ua_info import ua_list
import pymysql
class MaoyanSpider(object):
def __init__(self):
#初始化屬性對象
self.url='https://maoyan.com/board/4?offset={}'
#數據庫連接對象
self.db=pymysql.connect(
'localhost','root','123456','maoyandb',charset='utf8')
#創建游標對象
self.cursor=self.db.cursor()
def get_html(self,url):
headers={'User-Agent':random.choice(ua_list)}
req=request.Request(url=url,headers=headers)
res=request.urlopen(req)
html=res.read().decode()
# 直接解析
self.parse_html(html)
def parse_html(self,html):
re_bds='<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>'
pattern=re.compile(re_bds,re.S)
r_list=pattern.findall(html)
self.save_html(r_list)
def save_html(self, r_list):
L=[]
sql='insert into movieinfo values(%s,%s,%s)'
# 整理數據
for r in r_list:
t=(
r[0].strip(),
r[1].strip()[3:],
r[2].strip()[5:15]
)
L.append(t)
print(L)
# 一次性插入多條數據 L:[(),(),()]
try:
self.cursor.executemany(sql,L)
# 將數據提交數據庫
self.db.commit()
except:
# 發生錯誤則回滾
self.db.rollback()
def run(self):
for offset in range(0,11,10):
url=self.url.format(offset)
self.get_html(url)
time.sleep(random.uniform(1,3))
# 斷開游標與數據庫連接
self.cursor.close()
self.db.close()
if __name__=='__main__':
start=time.time()
spider=MaoyanSpider()
spider.run()
end=time.time()
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162復制代碼類型:[python]
數據庫查詢存儲結果,如下所示:
mysql> select * from movieinfo;
+----------------+----------------------------------------------------------+------------+
| name | star | time |
+----------------+----------------------------------------------------------+------------+
| 我不是藥神 | 徐崢,周一圍,王傳君 | 2018-07-05 |
| 肖申克的救贖 | 蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓 | 1994-09-10 |
| 綠皮書 | 維果·莫騰森,馬赫沙拉·阿里,琳達·卡德里尼 | 2019-03-01 |
| 海上鋼琴師 | 蒂姆·羅斯,比爾·努恩,克蘭倫斯·威廉姆斯三世 | 2019-11-15 |
| 小偷家族 | 中川雅也,安藤櫻,松岡茉優 | 2018-08-03 |
| 霸王別姬 | 張國榮,張豐毅,鞏俐 | 1993-07-26 |
| 哪吒之魔童降世 | 呂艷婷,囧森瑟夫,瀚墨 | 2019-07-26 |
| 美麗人生 | 羅伯托·貝尼尼,朱斯蒂諾·杜拉諾,賽爾喬·比尼·布斯特里克 | 2020-01-03 |
| 這個殺手不太冷 | 讓·雷諾,加里·奧德曼,娜塔莉·波特曼 | 1994-09-14 |
| 盜夢空間 | 萊昂納多·迪卡普里奧,渡邊謙,約瑟夫·高登-萊維特 | 2010-09-01 |
+----------------+----------------------------------------------------------+------------+
10 rows in set (0.01 sec)
開課吧廣場-人才學習交流平臺
*請認真填寫需求信息,我們會在24小時內與您取得聯系。