您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)如何使用Python操作MySQL數(shù)據(jù)庫,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
1、安裝
通過Python連接MySQL數(shù)據(jù)庫有很多庫,這里使用官方推薦的MySQL Connector/Python庫
通過pip命令安裝:
pip install mysql-connector-python
默認安裝的是最新的版本,我安裝的是8.0.17,對應MySQL的8.0版本。MySQL統(tǒng)一了其相關(guān)工具的大版本號,必須相同或更高才可以兼容。例如我使用的是MySQL8.0,如果使用低于8的mysql-connector就會報錯。事實上也是這樣,在某些舊的文檔中提示安裝pip install mysql-connector,就會安裝較低的版本,在連接MySQL時,會報錯如下:
mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported
這是由于mysql8.0使用了Use Strong Password Encryption for Authentication即強密碼加密,而低版本的mysql-connector采用舊的mysql_native_password加密方式,導致無法連接,因此注意使用和數(shù)據(jù)庫相兼容的版本。
可以通過connector類的connect()方法進行數(shù)據(jù)庫的連接,傳入服務器、端口號、用戶名、密碼、數(shù)據(jù)庫等參數(shù),其中服務器與端口號可省略,默認為localhost:3306。
import mysql.connector db = mysql.connector.connect( host='localhost', port='3306', user="root", password="123456", database="test" )
對數(shù)據(jù)庫、數(shù)據(jù)表的操作屬于模式定義語言(DDL),所有DDL語句的執(zhí)行都是依賴于一個叫cursor的數(shù)據(jù)結(jié)構(gòu)進行操作的。通過從connect對象中獲取cursor對象后就可以進行數(shù)據(jù)庫、表的相關(guān)操作了。例如創(chuàng)建一個數(shù)據(jù)庫、數(shù)據(jù)表
# 獲取數(shù)據(jù)庫的cursor cursor = db.cursor() # 創(chuàng)建數(shù)據(jù)庫 cursor.execute("CREATE DATABASE mydatabase") # 創(chuàng)建數(shù)據(jù)表 dbcursor.execute("CREATE TABLE customers (name varchar(255),address varchar(255))") # 修改表操作 dbcursor.execute('ALTER TABLE customers ADD COLUMN id INT PRIMARY KEY AUTO_INCREMENT') # 查詢并打印數(shù)據(jù)庫中的所有表 cursor.execute("show tables") for table in cursor: print(table)
插入、刪除、修改操作依舊是通過cursor對象來實現(xiàn),通過cursor的execute()方法執(zhí)行SQL操作,第一個參數(shù)是要執(zhí)行的SQL語句,第二個參數(shù)是語句中要填充的變量。
在執(zhí)行完所有的SQL操作后記得要通過數(shù)據(jù)庫對象的commit()將操作事務提交到數(shù)據(jù)庫,如果需要撤銷則通過rollback()方法回滾操作。
SQL語句中的變量可以用%s的形式作為占位符,然后再以python中元組的形式在執(zhí)行時將變量填入,如下所示:
值得注意的是無論是什么類型的數(shù)據(jù)在傳入時都被當做字符串類型,然后在執(zhí)行SQL操作時會將字符串轉(zhuǎn)化為相應的類型,因此此處的占位符都是%s,而沒有%d、%f等。
# 要執(zhí)行的SQL語句 sql = "INSERT INTO customers (name, address) VALUES (%s, %s)" # 以元組的形式填入數(shù)據(jù) val = ('Mike', 'Main street 20') # 執(zhí)行操作 cursor.execute(sql, val) # 提交事務 db.commit()
也可以用python中字典的形式填充變量,在SQL語句中的占位符需要使用對應的變量名
# 在SQL語句中指明變量名 sql = "INSERT INTO customers (name, address) VALUES (%(name)s, %(address)s)" # 以字典的形式填入數(shù)據(jù) val = { 'name': 'Alice', 'address': 'Center street 22' } cursor.execute(sql, val)
如果需要一次插入多條數(shù)據(jù),可以使用executemany()方法,將多條數(shù)據(jù)以數(shù)組的方式傳給第二個參數(shù)。
通過cursor的rowcount屬性可以返回成功操作的數(shù)據(jù)條數(shù),lastrowid屬性是最后一個成功插入的行的id
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)" # 以數(shù)組的形式填充數(shù)據(jù) val = [ ('Peter', 'Lowstreet 4'), ('Amy', 'Apple st 652'), ('Hannah', 'Mountain 21'), ] cursor.executemany(sql, val) print("成功插入%d條數(shù)據(jù),最后一條的id為:%d" % (cursor.rowcount, cursor.lastrowid))
修改、刪除數(shù)據(jù)的方法與插入類似,只需要把對應的SQL語句和變量值傳給execute()函數(shù)即可。可以看出MySQL-connector庫的操作是非常貼近原生SQL語言的。
# 修改數(shù)據(jù) sql = "UPDATE customers SET address=%s WHERE name=%s" val = ('Center street 21', 'Mike') cursor.execute(sql, val) # 刪除數(shù)據(jù) sql = "DELETE FROM customers WHERE name=%s" val = ('Hannah',) cursor.execute(sql, val)
執(zhí)行查詢操作和之前類似,都是通過execute()執(zhí)行對應的SQL語句,在執(zhí)行時將相應的數(shù)據(jù)填入即可。查詢結(jié)束后,結(jié)果集會保存在cursor當中,可以直接把cursor當作迭代器iterator來進行展開取得結(jié)果集中每條數(shù)據(jù)的對應字段。也可以通過cursor的fetchall()、fetchone()方法取得所有或一條結(jié)果集。
# 查詢customers表中id介于6到8之間的數(shù)據(jù)并返回name、address字段 query = "SELECT name,address FROM customers WHERE id BETWEEN %s AND %s" cursor.execute(query, (6, 8)) # 循環(huán)取出結(jié)果集中的每條數(shù)據(jù)并打印 for (name, address) in cursor: print("%s家的地址是%s" % (name, address)) # 輸出結(jié)果為: # Peter家的地址是Lowstreet 4 # Amy家的地址是Apple st 652 # Hannah家的地址是Mountain 21
通過原生的SQL語句可以進行更為復雜的查詢操作,例如通過where設置查詢條件、Order by進行字段排序、Limit設置返回結(jié)果條數(shù)、OFFSET查詢結(jié)果集的偏移、Join進行表連接操作
Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言,其最初的設計是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發(fā)獨立的項目和大型項目。
關(guān)于如何使用Python操作MySQL數(shù)據(jù)庫就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。