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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

python启动mysql_Python操作MySQL

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

安裝PyMySQL

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

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

安裝

pip3 install PyMySQL

打開數據庫連接

以下兩種寫法可以打開數據庫連接,返回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")

獲取游標

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

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

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

從db對象中獲取游標

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()

增刪改

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

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('新增數據行的id是:{}'.format(cursor.lastrowid))

cursor.close()

db.close()

打印結果:

新增數據行的id是:1

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

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'受影響行數是:{count}')print(f'從游標中也可以取到受影響行數:{cursor.rowcount}')

cursor.close()

db.close()

打印結果:

受影響行數是:1

從游標中也可以取到受影響行數:1

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

查詢

查詢數據之后,我們要從游標中取結果,有兩種取法,一次性全取和一行一行的取。

一次性全取 fetchall()

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

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

data=cursor.fetchall()print(data)

cursor.close()

db.close()

打印結果:

查詢到的數據行數是:3

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

可以看到從游標中取到的結果集被裝在了元組里,我們可以進一步遍歷元組獲取每一行:

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

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

data=cursor.fetchall()print(f'查詢到的數據行數是:{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()

打印結果:

查詢到的數據行數是: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'查詢到的數據行數是:{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()

打印結果:

查詢到的數據行數是:3

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

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

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

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。