成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一步一步教你如何用Python操作MySQL

開發 后端 MySQL
本文一步一步教你如何用Python操作MySQL。工欲善其事,必先利其器。所以第一步,我們先下載第三方庫。在這里,我用到的是pymysql庫。

?一步一步教你如何用Python操作MySQL?

工欲善其事,必先利其器。所以***步,我們先下載第三方庫。在這里,我用到的是pymysql庫。

下載庫:在命令行輸入 

pip install pymysql

下載后可檢驗一下是否成功下載。直接在命令行進入python然后導庫即可

C:\Users\June>python
Python 3.6.3 |Anaconda, Inc.| (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymysql
>>>

看到這個畫面就說明下載成功了,接下來學習如何操作數據庫了?。?!

連接數據庫 

import pymysql
# 連接數據庫
db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')

以上的參數是必填的

  • host: 這個是ip地址,因為我這里是本地的,所以填127.0.0.1,也可以填localhost。
  • user:用戶名,如果你也是本地的,就填root好了
  • passwd:這個是密碼,填上你自己設的密碼就可以了
  • db:這個是數據庫名,我這里選的是news數據庫
  • port:這個是端口,本地的一般都是3306
  • charset:這個是編碼方式,要和你數據庫的編碼方式一致,要不會連接失敗

連接上了,怎么驗證呢?這里我們可以選擇查一條數據 

try:
db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')
# 檢驗數據庫是否連接成功
cursor = db.cursor()
# 這個是執行sql語句,返回的是影響的條數
data = cursor.execute('SELECT * FROM `new`')
# 得到一條數據
one = cursor.fetchone()
print(data)
print(one)
except pymysql.Error as e:
print(e)
print('操作數據庫失敗')
finally:
# 如果連接成功就要關閉數據庫
if db:
db.close()

代碼解讀:因為在連接數據庫中,有時會發生連接失敗等異常,所以這里就進行捕捉異常,這里的異常都是在 pymsql.Error 里面。上面的代碼看不懂也沒關系,因為我接下來會說,如果運行后有結果證明連接成功。

在用完后,一定要記得關閉數據庫連接,防止資源泄露問題。

對數據進行查詢 

import pymysql
try:
conn = pymysql.connect(host='127.0.0.1',user='root',passwd='password',db='news',charset='utf8',port=3306)
# 這個是光標,用來操作數據庫語句
cursor = conn.cursor()
# 執行sql語句
cursor.execute('SELECT * FROM `new`')
print(cursor.fetchone())
# 關閉光標
cursor.close()
except pymysql.Error as e:
print(e)
print('操作數據庫失敗')
finally:
if conn:
conn.close()

代碼解讀:

  • cursor():這個是光標,用來執行mysql語句的,用完后也是需要關閉的
  • excute():這個是執行語句,執行參數的mysql語句
  • fetchone():這個是查看執行語句后的一條數據
  • fetchall():這個是查看所有數據

在查詢數據后,返回的是一整條數據,有沒有可以按字典形式來查詢的呢?來試試! 

print(cursor.fetchone()['name'])
Traceback (most recent call last):
File "E:/anaconda/python_project/mysql_test/test2.py", line 8, in <module>
print(cursor.fetchone()['name'])
TypeError: tuple indices must be integers or slices, not str

查了之后,編譯器想都不想就給了我這個錯誤,說這是個元組,不能這樣操作。

雖然python沒有提供,但是我們可以手動轉成字典來查詢啊

cursor這里有個屬性:description。獲取的是數據庫每個欄位情況,如下: 

print(cursor.description)
# 下面是結果
(('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False), ('title', 253, None, 50, 50, 0, False), ('content', 253, None, 2000, 2000, 0, False), ('view_count', 3, None, 11, 11, 0, False), ('release_time', 12, None, 19, 19, 0, False), ('author', 253, None, 20, 20, 0, True), ('from', 253, None, 20, 20, 0, True), ('is_valibale', 3, None, 11, 11, 0, False)

 所以,我們利用這個屬性手動生成字典 

# 將一條數據轉成字典方便查找
new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))
print(new)
# 下面是結果
{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂賽季報銷 濃眉詹皇發聲祝福', 'content': '他遭遇左腳跟腱撕裂,將缺席賽季剩下的比賽。這無疑對考辛斯和鵜鶘隊都是一個重大的打擊', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '騰訊體育', 'is_valibale': 1}

 這里利用zip函數和列表生成式來一行代碼就生成成功了

用字典來查詢,現在就可以了 

print(new['title'])
# 下面是結果
考辛斯跟腱撕裂賽季報銷 濃眉詹皇發聲祝福

但是,上面的只是一條數據的,如果是多條的呢?再按上面的方法就行不通了。這時就需要用到map函數了 

def new2dict(new):
return dict(zip([x[0] for x in cursor.description],[x for x in new]))
news_list = list(map(new2dict,cursor.fetchall()))
print(news_list)
# 下面是結果
[{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂賽季報銷 濃眉詹皇發聲祝福', 'content': '他遭遇左腳跟腱撕裂,將缺席賽季剩下的比賽。這無疑對考辛斯和鵜鶘隊都是一個重大的打擊', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '騰訊體育', 'is_valibale': 1}, {'id': 3, 'type': 'NBA', 'title': '火箭挖21分大哈登得背鍋 連遭濃眉大帽太尷尬', 'content': '火箭在客場以113-115惜敗于鵜鶘,4連勝終結。詹姆斯-哈登出戰34分鐘16投5中,其中三分球9投只有1中,罰球14罰12中,拿到23分、11助攻、5籃板但也有4次失誤,其在場正負值為尷尬的-12分', 'view_count': 7520, 'release_time': datetime.datetime(2018, 1, 27, 12, 5), 'author': 'youngcao', 'from': '騰訊體育','is_valibale': 1}, {'id': 4, 'type': '英超', 'title': '足總杯-曼聯4-0英乙球隊晉級 桑神首秀造兩球', 'content': '2017-18賽季英格蘭足總杯第4輪,曼聯客場4比0擊敗英乙球隊約維爾,順利晉級下一輪。桑切斯迎來曼聯首秀,并制造了兩個入球', 'view_count': 6560, 'release_time': datetime.datetime(2018, 1, 27, 5, 49), 'author': 'ricazhang', 'from': '騰訊體育','is_valibale': 1}, {'id': 5, 'type': '英超', 'title': '這才配紅魔7號!桑神首秀大腿級表演 回擊噓聲質疑', 'content': '在今天凌晨對陣約維爾的首秀也值得期待。雖然在登場的72分鐘時間里沒有進球,但送出1次助攻且有有6次威脅傳球的數據還是十分亮眼', 'view_count': 2760, 'release_time': datetime.datetime(2018, 1, 27, 6, 13), 'author': 'yaxinhao', 'from': '騰訊體育', 'is_valibale': 1}]

 這里很巧妙的利用了map函數,因為多條數據就可以進行迭代了,需要操作每條數據,這樣就可以想到map函數

接下來我們再用面向對象的方法來用python進行查詢數據庫 

import pymysql
class MysqlSearch(object):
def get_conn(self):
'''連接mysql數據庫'''
try:
self.conn = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',port=3306,charset='utf8',db='news')
except pymysql.Error as e:
print(e)
print('連接數據庫失敗')
def close_conn(self):
'''關閉數據庫'''
try:
if self.conn:
self.conn.close()
except pymysql.Error as e:
print(e)
print('關閉數據庫失敗')

def get_one(self):
'''查詢一條數據'''
try:
# 這個是連接數據庫
self.get_conn()
# 查詢語句
sql = 'SELECT * FROM `new` WHERE `type`=%s'
# 這個光標用來執行sql語句
cursor = self.conn.cursor()
cursor.execute(sql,('英超',))
new = cursor.fetchone()
# 返回一個字典,讓用戶可以按數據類型來獲取數據
new_dict = dict(zip([x[0] for x in cursor.description],new))
# 關閉cursor
cursor.close()
self.close_conn()
return new_dict
except AttributeError as e:
print(e)
return None
def get_all(self):
'''獲取所有結果'''
sql = 'SELECT * FROM `new` '
self.get_conn()
try:
cursor = self.conn.cursor()
cursor.execute(sql)
news = cursor.fetchall()
# 將數據轉為字典,讓用戶根據鍵來查數據
news_list =list(map(lambda x:dict(zip([x[0] for x in cursor.description],[d for d in x])),news))
# 這樣也行,連續用兩個列表生成式
news_list = [dict(zip([x[0] for x in cursor.description],row)) for row in news]
cursor.close()
self.close_conn()
return news_list
except AttributeError as e:
print(e)
return None

def main():
# 獲取一條數據
news = MysqlSearch()
new = news.get_one()
if new:
print(new)
else:
print('操作失敗')

# 獲取多條數據
news = MysqlSearch()
rest = news.get_all()
if rest:
print(rest)
print(rest[7]['type'],rest[7]['title'])
print('類型:{0},標題:{1}'.format(rest[12]['type'],rest[12]['title']))
for row in rest:
print(row)
else:
print('沒有獲取到數據')

if __name__ == '__main__':
main()

這樣就可以通過實例的方法來進行查詢數據庫了

我們還可以根據頁數來進行查詢指定的數據數 

def get_more(self,page,page_size):
'''查多少頁的多少條數據'''
offset = (page-1)*page_size
sql = 'SELECT * FROM `new` LIMIT %s,%s'
try:
self.get_conn()
cursor = self.conn.cursor()
cursor.execute(sql,(offset,page_size,))
news = [dict(zip([x[0] for x in cursor.description],new)) for new in cursor.fetchall()]
cursor.close()
self.close_conn()
return news
except AttributeError as e:
print(e)
return None

def main():
#獲取某頁的數據
news = MysqlSearch()
new = news.get_more(3,5)
if new:
for row in new:
print(row)
else:
print('獲取數據失敗')

if __name__ == '__main__':
main()

利用的是mysql的limit關鍵字,還有其他的,比如進行排序分組的感興趣的可以自己嘗試下

增加數據到數據庫 

def add_one(self):
sql = 'INSERT INTO `new`(`title`,`content`,`type`,`view_count`,`release_time`) VALUE(%s,%s,%s,%s,%s)'
try:
self.get_conn()
cursor = self.conn.cursor()
cursor.execute(sql, ('title', 'content', 'type', '1111', '2018-02-01'))
cursor.execute(sql, ('標題', '內容', '類型', '0000', '2018-02-01'))
# 一定需要提交事務,要不不會顯示,只會占位在數據庫
self.conn.commit()
return 1
except AttributeError as e:
print('Error:', e)
return 0
except TypeError as e:
print('Error:', e)
# 發生錯誤還提交就是把執行正確的語句提交上去
# self.conn.commit()
# 下面這個方法是發生異常就全部不能提交,但語句執行成功的就會占位
self.conn.rollback()
return 0
finally:
cursor.close()
self.close_conn()
def main():
news = OperateSQL()
if news.add_one():
print('增加數據成功')
else:
print('發生異常,請檢查!??!')
if __name__ == '__main__':
main()

因為是增加數據,所以需要提交事務,這就需要用到conn  .commit()來進行提交,在增加數據后,如果不提交,數據庫就不會顯示。 

還有修改數據和刪除數據就不貼出來了,只是把上面的sql變量的語句改成修改或者刪除的語句就可以了,如果你還不會,建議練習下 


責任編輯:龐桂玉 來源: Python愛好者社區
相關推薦

2009-07-06 19:29:37

云計算私有云服務器虛擬化

2024-07-22 11:43:28

LVMPnetLab網絡

2020-10-28 15:03:25

C+代碼開發

2009-12-17 08:57:28

Windows 7磁盤分區

2022-08-29 15:19:09

CSS煙花動畫

2020-05-07 09:25:20

數據庫MySQL代碼

2017-12-25 11:50:57

LinuxArch Linux

2024-09-13 15:20:46

2024-12-02 14:48:30

Docker鏡像文件

2025-04-08 09:30:00

SeataDocker分布式系統

2024-11-01 11:40:11

2012-03-22 10:33:33

思杰XenDesktop

2017-09-28 09:40:36

圖像分類準確率

2015-07-30 09:35:24

滑動返回代碼

2019-11-04 10:06:19

MySQL索引

2017-08-24 08:31:41

2011-06-07 16:03:48

匿名SQL Server

2017-11-29 11:14:52

離線緩存URL協議緩存

2013-03-18 16:09:27

JavaEEOpenfire

2013-09-13 13:25:16

html5拖拽
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲第一视频网站 | 日韩综合 | 国产99久久久国产精品 | 国产精品久久久亚洲 | 亚洲一区久久 | 国产一区二区欧美 | 国产高清免费在线 | 亚洲成av人片在线观看无码 | 国产午夜精品久久久久免费视高清 | 国产精品一区久久久 | 日日操夜夜摸 | 日韩中文一区二区三区 | 欧美三区在线观看 | 天天天天操| 亚洲精品影院 | 在线观看中文字幕 | 午夜精品在线 | 欧美亚洲视频在线观看 | 天天躁日日躁狠狠很躁 | 午夜电影日韩 | 中文久久 | 亚洲精品久久久一区二区三区 | 久久亚洲一区二区三区四区 | www.一级片 | 亚洲在线电影 | 欧美一级二级三级 | 九色在线视频 | 中文字幕一区在线观看视频 | 99久久久久久 | 免费视频一区 | 久久久tv| 国产精品久久久久一区二区三区 | 欧美性影院 | 欧美黄色精品 | 亚洲精品成人网 | 日韩免费网站 | 成人免费xxxxx在线视频 | 久久久久亚洲 | 国产精品久久二区 | 国产精品久久一区二区三区 | 亚洲 91 |