Python實(shí)現(xiàn)MySql數(shù)據(jù)庫交互的示例
一、使用MySql進(jìn)行持久化存儲(chǔ)
在任何應(yīng)用中,都需要持久化存儲(chǔ)。一般有 3 種基礎(chǔ)的存儲(chǔ)機(jī)制:文件、數(shù)據(jù)庫系統(tǒng)以及一些混合類型。這種混合類型包括現(xiàn)有系統(tǒng)上的 API、 ORM、文件管理器、電子表格、配置文件等。
對(duì)于非常簡單的應(yīng)用而言,使用文件作為持久化存儲(chǔ)通常就足夠了,但是當(dāng)文件或創(chuàng)建的數(shù)據(jù)存儲(chǔ)系統(tǒng)不適用于大項(xiàng)目時(shí),我們需要轉(zhuǎn)而使用數(shù)據(jù)庫,大多數(shù)復(fù)雜的數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用是需要使用全功能的關(guān)系數(shù)據(jù)庫的。
一個(gè)關(guān)系數(shù)據(jù)庫管理系統(tǒng)( RDBMS)通??梢怨芾矶鄠€(gè)數(shù)據(jù)庫,比如銷售、市場、用戶支持等,都可以在同一個(gè)服務(wù)端(如果 RDBMS 基于服務(wù)器,可以這樣。不過一些簡單的系統(tǒng)通常不是基于服務(wù)器的)。在本章將要看到的例子中, MySQL 是一種基于服務(wù)的RDBMS,因?yàn)樗幸粋€(gè)服務(wù)器進(jìn)程始終運(yùn)行以等待命令行輸入;而 SQLite 則不會(huì)運(yùn)行服務(wù)器。
二、安裝MySql數(shù)據(jù)庫和Python庫PyMySQL
在開始之前,請(qǐng)確保:
- 已經(jīng)安裝了MySql數(shù)據(jù)庫并已經(jīng)開啟了相關(guān)服務(wù)。
- 正確安裝名為PyMySQL的Python庫。
MySql數(shù)據(jù)庫的安裝請(qǐng)參考另一片文章。此處不再贅述。
在python3中,如果想要將數(shù)據(jù)存儲(chǔ)到mysql中,就需要借助PyMySQL來操作,安裝的話,還是推薦使用pip來進(jìn)行,簡單快捷。
相關(guān)鏈接:
GitHub : https://github.com/PyMySQL/
PyMySQL官方文梢 : http://pymysql.readthedocs.io/
PyPl: https://pypi.python.org/pypi/PyMySQL
pip install pymysql

驗(yàn)證一下安裝是否成功:

如果能夠像上圖輸出版本信息,則表示PyMySQL已經(jīng)成功安裝。
三、使用pymysql鏈接mysql數(shù)據(jù)庫
假設(shè)當(dāng)前MySql服務(wù)器運(yùn)行在本地,用戶名為root,密碼為123456,運(yùn)行端口為3306。
嘗試連接到數(shù)據(jù)庫并創(chuàng)建一個(gè)新的數(shù)據(jù)庫,名字叫testdb
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123456', port=3306)
cur = conn.cursor()
cur.execute('select version()')
data = cur.fetchone()
print(f'database version: {data}')
cur.execute('CREATE DATABASE testdb DEFAULT CHARACTER SET utf8')
conn.close()
能夠正常輸出版本,說明python已經(jīng)能夠成功連接到數(shù)據(jù)庫。

在數(shù)據(jù)庫中,也可以看到我們剛剛建立的新的數(shù)據(jù)庫。

四、創(chuàng)建表
一般來說,創(chuàng)建數(shù)據(jù)庫的操作只需要執(zhí)行一次就好了。當(dāng)然,我們也可以手動(dòng)創(chuàng)建數(shù)據(jù)庫 。
創(chuàng)建數(shù)據(jù)庫后,在連接時(shí)需要額外指定一個(gè)參數(shù) db 。
加下來,我們創(chuàng)建一個(gè)新的數(shù)據(jù)表students, 指定3個(gè)字段,如下所示:

import pymysql conn = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='testdb') cur = conn.cursor() sql = ''' CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id)) ''' cur.execute(sql) conn.close()
可以看到新的表已經(jīng)創(chuàng)建成功了。

五、插入數(shù)據(jù)
這里僅演示一下數(shù)據(jù)的插入,其他的操作,比如刪除數(shù)據(jù)、更新數(shù)據(jù)等等,請(qǐng)參考官方文檔示例。
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='testdb')
cur = conn.cursor()
sdudent = [
('001', '張三', 12),
('002', '李四', 13),
('003', '王五', 14)]
try:
cur.executemany("INSERT INTO students(id, name, age) VALUES (%s, %s, %s)", sdudent)
conn.commit()
except:
conn.rollback()
conn.close()
查表,可以看到數(shù)據(jù)已經(jīng)插入成功。

六、后記
注意,pymysql模塊中不能使用占位符 ? , 這點(diǎn)與SQLite不一樣。必須使用paramstyle = "pyformat"的風(fēng)格。
比如
# 這么寫會(huì)報(bào)錯(cuò)
cur.executemany("INSERT INTO students(id, name, age) VALUES (?, ?, ?)", sdudent)
發(fā)生異常: TypeError
not all arguments converted during string formatting
File “G:\Code\practice\testpython\mysql.py”, line 10, in
cur.executemany(“INSERT INTO students(id, name, age) VALUES (?, ?, ?)”, sdudent)
# 必須使用paramstyle = "pyformat"的風(fēng)格
cur.executemany("INSERT INTO students(id, name, age) VALUES (%s, %s, %s)", sdudent)
詳情在另一篇文章(《Python數(shù)據(jù)庫編程之關(guān)系數(shù)據(jù)庫API規(guī)范 》)里有描述,大致原因如下:
在整個(gè)數(shù)據(jù)庫模塊實(shí)現(xiàn)中沒有關(guān)于占位符的標(biāo)準(zhǔn)規(guī)則。但是,每一個(gè)模塊都定義了一個(gè)變量paramstyle, 它描述了將在查詢中使用的值替換格式。這一變量可能的值如下:


到此這篇關(guān)于Python實(shí)現(xiàn)MySql數(shù)據(jù)庫交互的示例的文章就介紹到這了,更多相關(guān)Python MySql數(shù)據(jù)庫交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python turtle實(shí)現(xiàn)貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了Python turtle實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
python簡易實(shí)現(xiàn)任意位數(shù)的水仙花實(shí)例
今天小編就為大家分享一篇python簡易實(shí)現(xiàn)任意位數(shù)的水仙花實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
jupyter?notebook內(nèi)核啟動(dòng)失敗問題及解決方法
這篇文章主要介紹了解決jupyter?notebook內(nèi)核啟動(dòng)失敗問題,本文給大家介紹了問題原因分析及解決方案,圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
Python使用multiprocessing實(shí)現(xiàn)一個(gè)最簡單的分布式作業(yè)調(diào)度系統(tǒng)
mutilprocess像線程一樣管理進(jìn)程,這個(gè)是mutilprocess的核心,他與threading很是相像,對(duì)多核CPU的利用率會(huì)比threading好的多,通過本文給大家介紹Python使用multiprocessing實(shí)現(xiàn)一個(gè)最簡單的分布式作業(yè)調(diào)度系統(tǒng),需要的朋友參考下2016-03-03
Python數(shù)據(jù)分析之?Pandas?Dataframe應(yīng)用自定義
這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe應(yīng)用自定義,文章基于python的相關(guān)資料展開?Pandas?Dataframe應(yīng)用自定義的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-05-05
pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列
這篇文章主要介紹了pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-07-07
python 查找文件夾下所有文件 實(shí)現(xiàn)代碼
python 查找文件夾下所有文件,需要的朋友可以參考下。2009-07-07

