python启动mysql_Python操作MySQL
安裝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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字典默认输出键还是值_说说在
- 下一篇: 二维绕任意点旋转_二维图形复合线性变换程