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客戶端中,執行SQL統一要用到游標對象,游標是數據庫中一個很重要的概念,字面意思就是游動的標記。
我們正常查詢數據,會用變量來接收SQL語句查詢返回的結果集,假設說我們的查詢量非常巨大,達到幾千萬上億行數據,那么我們的服務器內存會直線飆升,引起程序崩潰。如果查出來的數據還要遍歷進行處理的話,那么程序崩潰*2
但若是使用游標對象來查詢,查出的結果集不會立刻返回給客戶端,而是會存儲在mysql服務器上,可以理解成是mysql為用戶查詢操作開設的一個緩沖區,用來存儲查詢結果,然后客戶端從這個緩沖區中獲取數據內容。
從db對象中獲取游標
cursor = db.cursor()
創建表
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執行生效,就必須要做提交事務的動作。
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,但是它有一個受影響行數,執行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歲。
如果要對查出來的大量數據進行遍歷處理,最好就是用游標一行一行的讀出來處理,在上文獲取游標小節中講了,對變量進行遍歷和從游標中取數據是兩個概念,變量是存在于我們服務器內存中的,游標是數據庫的資源句柄。
游標還有一個fetchmany()方法,傳入一個int參數,指定獲取幾條數據,個人覺得是小概率用法。
總結
以上是生活随笔為你收集整理的python启动mysql_Python操作MySQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字典默认输出键还是值_说说在
- 下一篇: 二维绕任意点旋转_二维图形复合线性变换程