作為其他說話的比如java我們都曉得使用hibernate可以直接毗連數據庫那么Python毗連數據庫是怎樣樣的呢?
好了話不多說我們先看看Python是怎樣使用MySQL數據庫的呢
一、跟其他的說話一樣首先先安裝MySQL數據庫若是是windows用戶,mysql的安裝很是簡單,直接下載安裝文件,雙擊安裝文件一步一步停止把持即可。
Linux下的安裝可能會加倍簡單,除了下載安裝包停止安裝外,一樣平常的linux堆棧中都市有mysql,我們只必要經由過程一個呼吁就可以下載安裝:
Ubuntudeepin
>>sudoapt-getinstallmysql-server
>>Sudoapt-getinstallmysql-client
centOS/redhat
>>yuminstallmysql
二,安裝MySQL-python要想使python可以把持mysql就必要MySQL-python驅動,它是python把持mysql必不成少的模塊。
下載地點:https://pypi.python.org/pypi/MySQL-python/
下載MySQL-python-1.2.5.zip文件之后直接解壓。進入MySQL-python-1.2.5目錄:
>>pythonsetup.pyinstall
三,測試
測試很是簡單,搜檢MySQLdb模塊是否可以正常導入。
沒有報錯提示MySQLdb模塊找不到,聲名安裝OK,下面起頭使用python把持數據庫之前,我們有必要往返首回頭回憶一下mysql的根基把持:
四,mysql的根基把持$mysql-uroot-p(有密碼時)
$mysql-uroot(無密碼時)
五,python把持mysql數據庫根本>>>conn=MySQLdb.connect(host='localhost',port=3306,user='root',passwd='123456',db='test',)
Connect()編制用于建樹數據庫的毗連,里面可以指定參數:用戶名,密碼,主機等信息。
這只是毗連到了數據庫,要想把持數據庫必要建樹游標。
>>>cur=conn.cursor()
經由過程獲取到的數據庫毗連conn下的cursor()編制來建樹游標。
>>>cur.execute("createtablestudent(idint,namevarchar(20),classvarchar(30),agevarchar(10))")
經由過程游標cur把持execute()編制可以寫入純sql語句。經由過程execute()編制中寫如sql語句來對數據停止把持。
>>>cur.close()
cur.close()封鎖游標
>>>conn.commit()
conn.commit()編制在提交事物,在向數據庫插入一條數據時必需要有這個編制,不然數據不會被真正的插入。
>>>conn.close()
Conn.close()封鎖數據庫毗連
六,插入數據經由過程上面execute()編制中寫入純的sql語句來插入數據并不便當。如:
>>>cur.execute("insertintostudentvalues('2','Tom','3year2class','9')")
我要想插入新的數據,必需要對這條語句中的值做改削。我們可以做如下改削:
假設要一次向數據表中插入多條值呢?
executemany()編制可以一次插入多條值,實行單挑sql語句,可是頻頻實行參數列表里的參數,前往值為受影響的行數。
七,查詢數據
大概你已經考試考試了在python中經由過程
>>>cur.execute("select*fromstudent")
來查詢數據表中的數據,但它并沒有把表中的數據打印出來,有些絕望。
來看看這條語句獲得的是什么
>>>aa=cur.execute("select*fromstudent")
>>>printaa
5
它獲得的只是我們的表中有若干好多條數據。那若何才能獲得表中的數據呢?進入pythonshell
fetchone()編制可以輔佐我們獲得表中的數據,可是每次實行cur.fetchone()獲得的數據都不一樣,換句話說我沒實行一次,游標會從表中的第一條數據挪動到下一條數據的位置,所以,我再次實行的時辰獲得的是第二條數據。
scroll(0,'absolute')編制可以將游標定位到表中的第一條數據。
仍是沒處理我們想要的成效,若何獲得表中的多條數據并打印出來呢?
經由過程之前的printaa我們曉得當前的表中有5條數據,fetchmany()編制可以獲得多條數據,但必要指定命據的條數,經由過程一個for輪回就可以把多條數據打印出啦!實行成效如下:
Python說話里面有一些小的坑,特別隨意弄混弄錯,初學者若不注意的話,很隨意坑進去,下面我給大師深切解析一些這幾個坑,希望對初學者有所輔佐.
1.i+=1不便是++i
初學者對Python說話不是特別體味的話,又恰好有c++,java的說話背景,很隨意把++i和i+=1弄混
先來看一個小例子:
i=0
mylist=[1,2,3,4,5,6]
whilei<len(mylist):<p=""style="box-sizing:border-box;">
print(mylist[i])
++i
這段代碼會想固然的認為,沒有啥問題啊,一個輪回輸出,i不竭的+1,蠻對的呀.其實不是的,這個代碼會不息輸出1,一個死輪回.由于Python的詮釋器會將++i把持為+(+i).其中+表示是負數符號,對付--i也是近似的.
print(+1)
>>>1
print(++1)
>>>1
print(+++1)
>>>1
這下明白了++i雖然在Python語法是合法的,可是并不是我們理解的自增的把持.
2.分清楚==和is的用法
在斷定字符串是否相稱的時辰,初學者特別會弄混is和==,如許的成效是軌范在不合的情形下默示不合:
比如先看一個簡單的例子:
a='Hi'
b='Hi'
print(aisb)
>>>True
print(a==b)
>>>True#看起來is和==仿佛是一樣的
我們再看第二個例子:
str1='Woshiyigechihuo'
str2='Woshiyigechihuo'
print(str1isstr2)
>>>False#is的成效是False
print(str1==str2)
>>>True#==的成效為True,看二者不一樣了吧
第三個例子
str3='string'
str4=''.join(['s','t','r','i','n','g'])
print(str3)
>>>string
print(str3isstr4)
>>>False#is的成效是False
print(str3==str4)
>>>True#==的成效為True,看二者不一樣了吧
這就是很隨意同化初學者的地方,感受很奇異,為什么有的時辰is和==輸出不異,有的時辰不合呢.好我們來一探現實:
我們用內置的id()這函數,這個函數用來前往工具的內存地點,查一下就清楚了
is是工具的標示符,用來斗勁兩個工具的內存空間是不是一樣,是不是用的統一塊空間地點,而==是斗勁兩個工具的內容是否相稱.
3.毗連字符串特別是大規模的字符串,最好用join而不是+
字符串措置的時辰,最常用的是毗連,Python中的字符串與其他的說話有一點不合,它是不成變工具,一旦建樹不能改變.而這個特征直接會影響到Python中字符串毗連的服從.
用+毗連字符串:
str1,str2,str3='test','string','connection'
print(str1+str2+str3)
>>>teststringconnection
用join毗連字符串
str1,str2,str3='test','string','connection'
print(''.join([str1,str2,str3]))
>>>teststringconnection
可是若是毗連大規模的字符串,比如要毗連10萬擺布的字符串的時辰,join的編制服從就會快良多(甚至相差百倍).比如下面這10萬個字符串毗連.
long_str_list=['Thisisalongstring'forninrange(1,100000)]
緣故緣由是由于若要毗連字符串:S1+S2+S3+....+SN,由于字符串是不成變的工具,實行一次就要申請一塊新的內存,如許的話在N個字符串毗連的過程中,會產生N-1個中心成效,每產生一個中心成效就要申請一次內存,如許會嚴峻影響實行服從.
而join不一樣,它是一次性申請總的內存,然后把字符串里面的每一個元素復制到內存中去,所以join會快良多.
是以,字符串的毗連,尤其是大的字符串措置,最好用join
4.不要在for和while輪回后面寫else塊
Python供給了一種良多編程說話都不支撐的功能,那就是可以在輪回內部的語句塊后面直接編寫else塊。比如:
foriinrange(3):
print('Loop%d'%i)
else:
print('Elseblock')
>>>Loop0
>>>Loop1
>>>Loop2
>>>Elseblock
這種else塊會在整個輪回實行完之后馬上運轉。既然如斯,那它為什么叫做else呢?為什么不叫and?在if/else語句中,else的意思是:若是不實行前面阿誰if塊,那就實行else塊。
同理try/except/else也是如斯,該構造的else的寄義是:若是前面的try塊沒有失敗,那就實行else塊。
try/finally同樣很是直不雅觀不雅觀,這里的finally的意思是:實行過前面的try塊之后,不管若何老是實行finally塊。
問題來了對付剛接觸Python的軌范員可能會把for/else構造中的else塊理解為:若是輪回沒有正常實行完,那就實行else塊。
實際上剛好相反——在輪回里用break語句提早跳出,會導致軌范不實行else塊,這一點會有點繞.對付不熟悉for/else的人來說,會令閱讀代碼的人感應相稱費解.
如有疑問歡迎留下評論我會一一解答!