Python通過(guò)pymysql調(diào)用MySQL進(jìn)行增刪改移查
一、關(guān)系數(shù)據(jù)庫(kù)
1.數(shù)據(jù)模型
實(shí)體間的關(guān)系分為以下有三種:
1*)一對(duì)一模型
一對(duì)一(one-to-one)
關(guān)系模型用二維表格表示數(shù)據(jù)及數(shù)據(jù)聯(lián)系,是應(yīng)用最為廣泛的數(shù)據(jù)模型。目前,各種常用的數(shù)據(jù)庫(kù),如Microsoft SQL Server、Microsoft Access、Microsoft FoxPro、Oracle、MySQL、SQLite等,都屬于關(guān)系模型數(shù)據(jù)庫(kù)管理系統(tǒng)。
2*)一對(duì)多模型
一對(duì)多(one-to-many)
層次模型采用樹(shù)狀結(jié)構(gòu)表示數(shù)據(jù)之間的聯(lián)系,樹(shù)的節(jié)點(diǎn)稱(chēng)為記錄,記錄之間只有簡(jiǎn)單的層次關(guān)系。有且只有一個(gè)節(jié)點(diǎn)沒(méi)有父節(jié)點(diǎn),該節(jié)點(diǎn)稱(chēng)為根節(jié)點(diǎn);其他節(jié)點(diǎn)有且只有一個(gè)父節(jié)點(diǎn)。
3*)多對(duì)多模型
多對(duì)多(many-to-many)
可以有任意多個(gè)節(jié)點(diǎn)沒(méi)有父節(jié)點(diǎn)。一個(gè)節(jié)點(diǎn)允許有多個(gè)父節(jié)點(diǎn)。兩個(gè)節(jié)點(diǎn)之間可以有兩種或兩種以上聯(lián)系。
2.面相對(duì)象模型
1*)對(duì)象模型概念
面向?qū)ο竽P褪窃诿嫦驅(qū)ο蠹夹g(shù)基礎(chǔ)上發(fā)展起來(lái)一種的數(shù)據(jù)模型,它采用面向?qū)ο蟮姆椒▉?lái)設(shè)計(jì)數(shù)據(jù)庫(kù)。
2*)對(duì)象模型特點(diǎn)
面向?qū)ο竽P偷臄?shù)據(jù)庫(kù)種存儲(chǔ)對(duì)象以對(duì)象為單位,每個(gè)對(duì)象包含對(duì)象的屬性和方法,具有類(lèi)和繼承等特點(diǎn)。
二、了解關(guān)系數(shù)據(jù)庫(kù)的概念和特點(diǎn)
關(guān)系數(shù)據(jù)庫(kù)的概念和特點(diǎn)
基本概念
i*)關(guān)系
數(shù)據(jù)和數(shù)據(jù)之間的聯(lián)系稱(chēng)為關(guān)系。
ii*)二維表
關(guān)系數(shù)據(jù)庫(kù)使用二維表來(lái)表示和存儲(chǔ)關(guān)系,一個(gè)關(guān)系就是一個(gè)二維表。表中的行稱(chēng)為記錄,列稱(chēng)為字段。一個(gè)數(shù)據(jù)庫(kù)可以包含多個(gè)表。
iii*)記錄與字段
表中的一行稱(chēng)為一個(gè)記錄。表中的列為記錄中的數(shù)據(jù)項(xiàng),稱(chēng)為字段。字段也稱(chēng)為屬性或者列。每個(gè)記錄可以包含多個(gè)字段,不同記錄包含相同的字段(字段的值不同)。例如,用戶(hù)表中的每個(gè)記錄包含用戶(hù)名、登錄密碼等字段。
關(guān)系數(shù)據(jù)庫(kù)不允許在一個(gè)表中出現(xiàn)重復(fù)的記錄。
VI*)關(guān)鍵字
可以唯一標(biāo)識(shí)一個(gè)記錄的字段或字段組合稱(chēng)為關(guān)鍵字。一個(gè)表可有多個(gè)關(guān)鍵字,其中用于標(biāo)識(shí)記錄的關(guān)鍵字稱(chēng)為主關(guān)鍵字,其他的關(guān)鍵字可稱(chēng)為候選關(guān)鍵字。一個(gè)表只允許有一個(gè)主關(guān)鍵字。例如,用戶(hù)表中的用戶(hù)名可定義為主關(guān)鍵字,在添加記錄時(shí),主關(guān)鍵字不允許重復(fù)。
VII*)外部關(guān)鍵字
如果一個(gè)表中的字段或字段組合作為其他表的主關(guān)鍵字,這樣的字段或字段組合稱(chēng)為外部關(guān)鍵字。
基本特點(diǎn)
1.關(guān)系數(shù)據(jù)庫(kù)中的表是二維表,表中的字段必須是不可再分的,即不允許表中表。
2.在同一個(gè)表中不允許出現(xiàn)重復(fù)的記錄。
3.在同一個(gè)記錄中不允許出現(xiàn)重復(fù)的字段。
4.表中記錄先后順序不影響數(shù)據(jù)的性質(zhì),可以交換記錄順序。
5.記錄中字段的順序不影響數(shù)據(jù),可以交換字段的順序。
三、常用字段數(shù)據(jù)類(lèi)型
數(shù)據(jù)表格
四、使Mysql和Pymysql鏈接成功
第一步、先在Navicat Premium 12中找到數(shù)據(jù)表登錄鏈接
注明:數(shù)據(jù)表一定要存在 不然數(shù)據(jù)修改追加不進(jìn)去的?。。。?/p>
第二步、 顯示鏈接成功后登入spyder 或者pycharm使用pymysql調(diào)用mysql
注明:博主使用的spyder
import pymysql #定義數(shù)據(jù)庫(kù)鏈接參數(shù) host = '127.0.0.1' #或者用local host port = 3306 db = 'student' user = 'root' password = 'lyt2529165097' conn = pymysql.connect(host=host, port=port, db=db, user=user, password=password) def main(): cursor = conn.cursor(pymysql.cursors.SSCursor) #流式游標(biāo),默認(rèn)返回元組 return cursor 通過(guò)在spyder里面輸入主機(jī)號(hào) 端口號(hào) 主機(jī)名 密碼等就可以登錄進(jìn)去了
第三步、編寫(xiě)代碼登錄系統(tǒng)
1.編寫(xiě)系統(tǒng)登錄退出界面
while True: print('請(qǐng)選擇以下菜單號(hào):') print('========='*3) print('1、登錄學(xué)生信息管理系統(tǒng)') print('2、退出學(xué)生信息管理系統(tǒng)') print('========='*3) mc1 = int(input('輸入菜單號(hào):')) if mc1 == 1: login() elif mc1 == 2: print('感謝使用學(xué)生信息管理系統(tǒng)!') break
當(dāng)然了,進(jìn)入系統(tǒng)怎么可能不需要密碼呢。一定要給自己設(shè)置密碼哦 不然別人半夜刪你代碼?。?!
2.編寫(xiě)進(jìn)入系統(tǒng)用戶(hù)名和密碼
def login(): administartor = input('請(qǐng)輸入用戶(hù)名:') password = input('請(qǐng)輸入密碼:') if administartor == '雷云騰' and password == 'lyt2529165097':
成功進(jìn)入系統(tǒng)后,就可以編寫(xiě)下一個(gè)程序了,比如我們把菜單系統(tǒng)都編寫(xiě)出來(lái),這樣就有了一個(gè)整體架構(gòu)
3.編寫(xiě)登錄后供選擇的菜單
登錄主菜單
#登入后的菜單----展開(kāi) def login(): administartor = input('請(qǐng)輸入用戶(hù)名:') password = input('請(qǐng)輸入密碼:') if administartor == '雷云騰' and password == 'lyt2529165097': print("恭喜你成功登錄系統(tǒng)!!") while True: print('學(xué)生信息管理系統(tǒng)') print('================') print('1、增加學(xué)生記錄') print('2、查詢(xún)學(xué)生記錄') print('3、修改學(xué)生記錄') print('4、刪除學(xué)生記錄') print('5、顯示所有的學(xué)生記錄') print('6、返回上級(jí)菜單') print('=================') mc2 = int(input('輸入菜單號(hào):')) if mc2 == 1: add_student() elif mc2 == 2: query_student() elif mc2 == 3: update_student elif mc2 == 4: delete_student() elif mc2==5: print_student() else: break else: print('賬號(hào)或密碼錯(cuò)誤!')
成功進(jìn)入系統(tǒng)后并且擁有菜單系統(tǒng)的時(shí)候就可以編寫(xiě)下一個(gè)程序了,比如我們先編寫(xiě)插入記錄的程序
4.編寫(xiě)增加學(xué)生記錄的程序
#插入學(xué)生記錄 def add_student(): cursor = main() id = int(input('學(xué)號(hào):')) name = input('姓名:') gender = input('性別:') age = int(input('年齡:')) class1 = input('班級(jí):') major = input('專(zhuān)業(yè):') college = input('學(xué)院:') add = cursor.execute('insert into stu (id, name, gender, age, class1, major, college)\ values(%s,%s,%s,%s,%s,%s,%s)',(id, name, gender, age, class1, major, college)) if add == 1: conn.commit() print('插入成功!') else: print('插入失敗!')
第四步、編寫(xiě)查詢(xún)學(xué)生信息記錄的代碼
I*)按照學(xué)號(hào)查詢(xún)學(xué)生記錄
#按學(xué)號(hào)查詢(xún) def Q_by_id(): cursor = main() choice_id = int(input('請(qǐng)輸入學(xué)號(hào):')) cursor.execute('select * from stu where id =%s',(choice_id)) students = cursor.fetchall() for stu in students: print(stu[0], stu[1], stu[2], stu[3], stu[4], stu[5], stu[6]) print('查詢(xún)成功') re = input('是否繼續(xù)查詢(xún)(yes/no):') if re == 'yes': Q_by_id() else: query_student()
II*)按照姓名查詢(xún)學(xué)生記錄
#按姓名查詢(xún)(以防學(xué)號(hào)輸入錯(cuò)誤) def Q_by_name(): cursor = main() choose_name = input('請(qǐng)輸入姓名:') cursor.execute('select * from stu where name =%s',(choose_name)) students = cursor.fetchall() for stu in students: print(stu[0], stu[1], stu[2], stu[3], stu[4], stu[5], stu[6]) print() re = input('是否繼續(xù)查詢(xún)yes/no:') if re == 'yes': Q_by_name() else: query_student()
III*)查詢(xún)所有學(xué)生的信息記錄
#查詢(xún)所有學(xué)生 def Q_all(): cursor = main() cursor.execute('select * from stu') students = cursor.fetchall() for student in students: print('\t{}\t{}\t{}\t{}\t{}\t{}\t{}' .format(student[0], student[1], student[2], student[3], student[4], student[5], student[6]))
這樣就查詢(xún)成功啦!,如果還想要進(jìn)行查詢(xún)的話(huà),也是可以編寫(xiě)代碼來(lái)實(shí)現(xiàn)的!
VI*)編寫(xiě)"是否"進(jìn)行查詢(xún)記錄
re = input('是否繼續(xù)查詢(xún)(yes/no):') if re == 'yes': Q_by_id() else: query_student()
當(dāng)然 除了能查詢(xún) 當(dāng)然還得有可供我們選擇的菜單啦!不然我們是無(wú)法進(jìn)入程序經(jīng)行增刪改查的
VII*)寫(xiě)出登錄菜單后還要寫(xiě)出可供我們查詢(xún)的菜單
查詢(xún)記錄菜單
#查詢(xún)的菜單 def query_student(): while True: print('查詢(xún)學(xué)生記錄') print('================') print('1、按學(xué)號(hào)查詢(xún)學(xué)生記錄') print('2、按姓名查詢(xún)學(xué)生記錄') print('3、查詢(xún)?nèi)繉W(xué)生記錄') print('4、返回上級(jí)菜單') print('=================') mc3 = int(input('請(qǐng)輸入查詢(xún)的菜單號(hào):')) if mc3 == 1: Q_by_id() elif mc3 == 2: Q_by_name() elif mc3 == 3: Q_all() else: break
注明:不光要寫(xiě)出代碼 還要寫(xiě)出可供選擇的菜單哦~
VII*)編寫(xiě)刪除學(xué)生記錄程序
刪除記錄的菜單
#刪除的菜單 def delete1_student(): print('============================') print('1、刪除學(xué)生所有信息') print('2、回到初始界面') print('============================') mc4 = int(input('Input menu number:')) if mc4 == 1: delete_student() elif mc4 == 3: login()
刪除學(xué)生姓名為雷云騰的信息
首先要知道他的學(xué)號(hào),然后還有姓名
接下來(lái)就是我們最難的環(huán)節(jié) 也是我們的重頭戲 修改指定的學(xué)生記錄
還是需要知道他的學(xué)號(hào),姓名
def update_student(): cursor = main() cur= int(input('請(qǐng)輸入想要修改學(xué)生的學(xué)號(hào):')) cursor.execute('select * from stu where id = %s', (cur)) if cursor.fetchall() == []: print('未查找到學(xué)號(hào)是{}的學(xué)生'.format(cur)) mc3 = input('是否重新查詢(xún)?(yes/no)') if mc3 != 'no': update_student() else: login() else: print('==============') print('1、修改姓名') print('2、修改性別') print('3、修改年齡') print('4、修改班級(jí)') print('5、修改專(zhuān)業(yè)') print('6、修改學(xué)院') print('7、返回上級(jí)菜單') print('==============') mc2 = int(input('請(qǐng)輸入菜單號(hào):')) if mc2 == 1: name = input('請(qǐng)輸入修改后的名字:') a = cursor.execute('update stu set name = %s where id = %s', (name, cur)) if a == 1: conn.commit() print('修改成功!') else: print('修改失??!') elif mc2 == 2: gender1 = input('請(qǐng)輸入修改后的性別:') a = cursor.execute('update stu set genden = %s where id = %s', (gender1, cur)) if a > 1: conn.commit() print('修改成功!') else: print('修改失?。?) elif mc2 == 3: age1 = int(input('請(qǐng)輸入修改后的年齡:')) a = cursor.execute('update stu set age = %s where id = %s', (age1, cur)) if a > 1: conn.commit() print('修改成功!') else: print('修改失敗!') elif mc2 == 4: class1 = input('請(qǐng)輸入修改后的班級(jí):') a = cursor.execute('update stu set class = %s where id = %s', (class1, cur)) if a > 1: conn.commit() print('修改成功!') else: print('修改失??!') elif mc2 == 5: major1 = input('請(qǐng)輸入修改后的專(zhuān)業(yè):') a = cursor.execute('update stu set major = %s where id = %s', (major1, cur)) if a > 1: conn.commit() print('修改成功!') else: print('修改失??!') elif mc2 == 6: college1 = input('請(qǐng)輸入修改后的學(xué)院:') a = cursor.execute('update stu set college = %s where id = %s', (college1, cur)) if a > 1: conn.commit() print('修改成功!') else: print('修改失??!') else: pass#占一個(gè)空位符
當(dāng)我還沒(méi)有關(guān)閉數(shù)據(jù)表時(shí)還未更新,這時(shí)候我們需要關(guān)閉所更新的數(shù)據(jù)表并且重新打開(kāi)
這時(shí)候我們關(guān)閉數(shù)據(jù)表他就會(huì)對(duì)我們所更改的數(shù)據(jù)進(jìn)行更新
當(dāng)然除了更改姓名還可以更改學(xué)號(hào) 性別學(xué)院等等…
五、 All源碼(注明)
這個(gè)就不告訴大家了 給大家講了那么多知識(shí),相信多看看多實(shí)訓(xùn)一定都能打出來(lái)甚至做的更好的。
六、博客總結(jié)
1.為什么會(huì)寫(xiě)代碼
現(xiàn)在代碼不僅會(huì)增加自己學(xué)識(shí)和思維 隨著學(xué)識(shí)的增加 也會(huì)影響到其他事物中去,當(dāng)然,在博客中經(jīng)常會(huì)遇到一些生活、學(xué)習(xí)上的看似棘手的問(wèn)題,那時(shí)我總是在舉步維艱時(shí)強(qiáng)迫自己認(rèn)為能找到出路。久而久之,自己也產(chǎn)生了這樣一種思維模式,認(rèn)為事情總是可以找到答案的。每次寫(xiě)出一個(gè)博客和文章得到同行和老師的稱(chēng)贊我都會(huì)興奮不已 為我下一次更好的博客內(nèi)容做鋪墊。
2.特定思維
在這個(gè)過(guò)程中,我又感覺(jué)到寫(xiě)代碼也與之前解決問(wèn)題的模式相似,每一次完成一個(gè)完整的東西,都形成了一種特定思維模式的一小部分,也許這就是寫(xiě)代碼的樂(lè)趣。
3.思維靈感
當(dāng)我每次困惑一個(gè)問(wèn)題很久很久不能解決的時(shí)候 我會(huì)感到很壓抑,這時(shí)候我會(huì)試著出去呼吸一下新鮮空氣 伸個(gè)懶腰 把思緒放空。你就會(huì)發(fā)現(xiàn)身上頓時(shí)輕松了很多。回來(lái)再解決這個(gè)困惑的時(shí)候發(fā)現(xiàn)特別容易。有時(shí)候靈感就是你壓抑很久突然放松之后來(lái)的,那一瞬間。
4.腦+手
培養(yǎng)自己編程思維,培養(yǎng)自己編程樂(lè)趣。代碼不是憑空想象出來(lái)的,是一行一行的敲出來(lái)的,運(yùn)行成功沒(méi)有捷徑 只有靠自己的腦+手。
以上就是Python通過(guò)pymysql調(diào)用MySQL進(jìn)行增刪改移查的詳細(xì)內(nèi)容,更多關(guān)于Python pymysql增刪改移查的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)將不規(guī)范的英文名字首字母大寫(xiě)
這篇文章給大家主要介紹的是利用map()函數(shù),把用戶(hù)輸入的不規(guī)范的英文名字,變?yōu)槭鬃帜复髮?xiě),其他小寫(xiě)的規(guī)范名字。文中給出了三種解決方法,大家可以根據(jù)需要選擇使用,感興趣的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11python通過(guò)函數(shù)屬性實(shí)現(xiàn)全局變量的方法
這篇文章主要介紹了python通過(guò)函數(shù)屬性實(shí)現(xiàn)全局變量的方法,實(shí)例分析了Python中函數(shù)屬性的相關(guān)使用技巧,需要的朋友可以參考下2015-05-05利用PyQt中的QThread類(lèi)實(shí)現(xiàn)多線(xiàn)程
本文主要給大家分享的是python實(shí)現(xiàn)多線(xiàn)程及線(xiàn)程間通信的簡(jiǎn)單方法,非常的實(shí)用,有需要的小伙伴可以參考下2020-02-02在Django中編寫(xiě)模版節(jié)點(diǎn)及注冊(cè)標(biāo)簽的方法
這篇文章主要介紹了在Django中編寫(xiě)模版節(jié)點(diǎn)及注冊(cè)標(biāo)簽的方法,Django是Python各式各樣的高人氣框架中最為著名的一個(gè),需要的朋友可以參考下2015-07-07pytorch實(shí)現(xiàn)下載加載mnist數(shù)據(jù)集
這篇文章主要介紹了pytorch實(shí)現(xiàn)下載加載mnist數(shù)據(jù)集方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Python中的文件和目錄操作實(shí)現(xiàn)代碼
對(duì)于文件和目錄的處理,雖然可以通過(guò)操作系統(tǒng)命令來(lái)完成,但是Python語(yǔ)言為了便于開(kāi)發(fā)人員以編程的方式處理相關(guān)工作,提供了許多處理文件和目錄的內(nèi)置函數(shù)。重要的是,這些函數(shù)無(wú)論是在Unix、Windows還是Macintosh平臺(tái)上,它們的使用方式是完全一致的。2011-03-03