日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

python启动mysql_Python操作MySQL

發(fā)布時間:2024/9/15 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python启动mysql_Python操作MySQL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

安裝PyMySQL

python中連接mysql的客戶端主要有mysqldb、mysql-connector、pymysql三種。雖說性能上面各有差別,但是主流市場還是以操作便捷、使用簡單為選擇條件。

這里我選擇以純python編寫的mysql連接庫pymysql為首。

安裝

pip3 install PyMySQL

打開數(shù)據(jù)庫連接

以下兩種寫法可以打開數(shù)據(jù)庫連接,返回db對象。

db = pymysql.connect("127.0.0.1", "root", "132456", "test")

db= pymysql.connect(host="127.0.0.1",user="root",password="132456",database="test")

獲取游標(biāo)

我們在python中使用mysql接口操作數(shù)據(jù)庫,對于mysql來說,python就是客戶端,在python客戶端中,執(zhí)行SQL統(tǒng)一要用到游標(biāo)對象,游標(biāo)是數(shù)據(jù)庫中一個很重要的概念,字面意思就是游動的標(biāo)記。

我們正常查詢數(shù)據(jù),會用變量來接收SQL語句查詢返回的結(jié)果集,假設(shè)說我們的查詢量非常巨大,達(dá)到幾千萬上億行數(shù)據(jù),那么我們的服務(wù)器內(nèi)存會直線飆升,引起程序崩潰。如果查出來的數(shù)據(jù)還要遍歷進(jìn)行處理的話,那么程序崩潰*2

但若是使用游標(biāo)對象來查詢,查出的結(jié)果集不會立刻返回給客戶端,而是會存儲在mysql服務(wù)器上,可以理解成是mysql為用戶查詢操作開設(shè)的一個緩沖區(qū),用來存儲查詢結(jié)果,然后客戶端從這個緩沖區(qū)中獲取數(shù)據(jù)內(nèi)容。

從db對象中獲取游標(biāo)

cursor = db.cursor()

創(chuàng)建表

sql = '''CREATE TABLE user(

id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id',

username VARCHAR(16) NOT NULL COMMENT '姓名',

sex INT(1) UNSIGNED NOT NULL COMMENT '性別 1男2女',

age INT(11) UNSIGNED NOT NULL COMMENT '年齡',

PRIMARY KEY (id)

)

ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;'''cursor.execute(sql)

cursor.close()

db.close()

增刪改

如果你的數(shù)據(jù)庫支持事務(wù),那么pymysql在你建立游標(biāo)的時候就自動開啟了事務(wù),所以我們想要讓SQL執(zhí)行生效,就必須要做提交事務(wù)的動作。

sql = '''INSERT INTO user(username,sex,age) VALUES ('小明',1,18);'''

try:

cursor.execute(sql)exceptException as e:

db.rollback()print(e)else:

db.commit()print('新增數(shù)據(jù)行的id是:{}'.format(cursor.lastrowid))

cursor.close()

db.close()

打印結(jié)果:

新增數(shù)據(jù)行的id是:1

修改操作和新增操作是一樣的,當(dāng)然修改操作取不到自增id,就算取結(jié)果也是0,但是它有一個受影響行數(shù),執(zhí)行execute方法會返回受影響行數(shù),從游標(biāo)中也一樣可以取到。

sql = '''UPDATE user SET age = 19 WHERE id = 1'''count=0try:

count=cursor.execute(sql)exceptException as e:

db.rollback()print(e)else:

db.commit()print(f'受影響行數(shù)是:{count}')print(f'從游標(biāo)中也可以取到受影響行數(shù):{cursor.rowcount}')

cursor.close()

db.close()

打印結(jié)果:

受影響行數(shù)是:1

從游標(biāo)中也可以取到受影響行數(shù):1

刪除和修改就完全是換條SQL而已,這里就不做多余的演示了。

查詢

查詢數(shù)據(jù)之后,我們要從游標(biāo)中取結(jié)果,有兩種取法,一次性全取和一行一行的取。

一次性全取 fetchall()

sql = '''SELECT * FROM user'''count=0try:

count=cursor.execute(sql)exceptException as e:print(e)print(f'查詢到的數(shù)據(jù)行數(shù)是:{count}')

data=cursor.fetchall()print(data)

cursor.close()

db.close()

打印結(jié)果:

查詢到的數(shù)據(jù)行數(shù)是:3

((1, '小明', 1, 19), (2, '小強', 1, 18), (3, '小花', 2, 17))

可以看到從游標(biāo)中取到的結(jié)果集被裝在了元組里,我們可以進(jìn)一步遍歷元組獲取每一行:

sql = '''SELECT * FROM user'''count=0try:

count=cursor.execute(sql)exceptException as e:print(e)

data=cursor.fetchall()print(f'查詢到的數(shù)據(jù)行數(shù)是:{count}')for row indata:if row[2] == 1:

sex= '男'

elif row[2] == 2:

sex= '女'

else:

sex= '未知'

print(f'ID號{row[0]}:姓名是{row[1]},性別是{sex},今年{row[3]}歲。')

cursor.close()

db.close()

打印結(jié)果:

查詢到的數(shù)據(jù)行數(shù)是:3

ID號1:姓名是小明,性別是男,今年19歲。

ID號2:姓名是小強,性別是男,今年18歲。

ID號3:姓名是小花,性別是女,今年17歲。

一行一行取 fetchone()

sql = '''SELECT * FROM user'''count=0try:

count=cursor.execute(sql)exceptException as e:print(e)print(f'查詢到的數(shù)據(jù)行數(shù)是:{count}')for i inrange(count):

row=cursor.fetchone()if row[2] == 1:

sex= '男'

elif row[2] == 2:

sex= '女'

else:

sex= '未知'

print(f'ID號{row[0]}:姓名是{row[1]},性別是{sex},今年{row[3]}歲。')

cursor.close()

db.close()

打印結(jié)果:

查詢到的數(shù)據(jù)行數(shù)是:3

ID號1:姓名是小明,性別是男,今年19歲。

ID號2:姓名是小強,性別是男,今年18歲。

ID號3:姓名是小花,性別是女,今年17歲。

如果要對查出來的大量數(shù)據(jù)進(jìn)行遍歷處理,最好就是用游標(biāo)一行一行的讀出來處理,在上文獲取游標(biāo)小節(jié)中講了,對變量進(jìn)行遍歷和從游標(biāo)中取數(shù)據(jù)是兩個概念,變量是存在于我們服務(wù)器內(nèi)存中的,游標(biāo)是數(shù)據(jù)庫的資源句柄。

游標(biāo)還有一個fetchmany()方法,傳入一個int參數(shù),指定獲取幾條數(shù)據(jù),個人覺得是小概率用法。

總結(jié)

以上是生活随笔為你收集整理的python启动mysql_Python操作MySQL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。