通過python連線mysql資料庫有很多庫,這裡使用官方推薦的mysql connector/python庫,其官網為:
通過pip命令安裝:
pip install mysql-connector-python
預設安裝的是最新的版本,我安裝的是8.0.17,對應mysql的8.0版本。mysql統一了其相關工具的大版本號,必須相同或更高才可以相容。例如我使用的是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加密方式,導致無法連線,因此注意使用和資料庫相相容的版本。
可以通過connector類的connect()方法進行資料庫的連線,傳入伺服器、埠號、使用者名稱、密碼、資料庫等引數,其中伺服器與埠號可省略,預設為localhost:3306。
import mysql.connector
db = mysql.connector.connect(
host='localhost',
port='3306',
user="root",
password="123456",
database="test"
)
對資料庫、資料表的操作屬於模式定義語言(ddl),所有ddl語句的執行都是依賴於乙個叫cursor的資料結構進行操作的。通過從connect物件中獲取cursor物件後就可以進行資料庫、表的相關操作了。例如建立乙個資料庫、資料表
# 獲取資料庫的cursor
cursor = db.cursor()
# 建立資料庫
cursor.execute("create database mydatabase")
# 建立資料表
dbcursor.execute("create table customers (name varchar(255),address varchar(255))")
# 修改表操作
dbcursor.execute('alter table customers add column id int primary key auto_increment')
# 查詢並列印資料庫中的所有表
cursor.execute("show tables")
for table in cursor:
print(table)
插入、刪除、修改操作依舊是通過cursor物件來實現,通過cursor的execute()方法執行sql操作,第乙個引數是要執行的sql語句,第二個引數是語句中要填充的變數。
在執行完所有的sql操作後記得要通過資料庫物件的commit()將操作事務提交到資料庫,如果需要撤銷則通過rollback()方法回滾操作。
sql語句中的變數可以用%s的形式作為佔位符,然後再以python中元組的形式在執行時將變數填入,如下所示:
值得注意的是無論是什麼型別的資料在傳入時都被當做字串型別,然後在執行sql操作時會將字串轉化為相應的型別,因此此處的佔位符都是%s,而沒有%d、%f等。
# 要執行的sql語句
sql = "insert into customers (name, address) values (%s, %s)"
# 以元組的形式填入資料
val = ('mike', 'main street 20')
# 執行操作
cursor.execute(sql, val)
# 提交事務
db.commit()
也可以用python中字典的形式填充變數,在sql語句中的佔位符需要使用對應的變數名
# 在sql語句中指明變數名
sql = "insert into customers (name, address) values (%(name)s, %(address)s)"
# 以字典的形式填入資料
val =
cursor.execute(sql, val)
如果需要一次插入多條資料,可以使用executemany()方法,將多條資料以陣列的方式傳給第二個引數。
通過cursor的rowcount屬性可以返回成功操作的資料條數,lastrowid屬性是最後乙個成功插入的行的id
sql = "insert into customers (name, address) values (%s, %s)"
# 以陣列的形式填充資料
val = [
('peter', 'lowstreet 4'),
('hannah', 'mountain 21'),
]cursor.executemany(sql, val)
print("成功插入%d條資料,最後一條的id為:%d" % (cursor.rowcount, cursor.lastrowid))
修改、刪除資料的方法與插入類似,只需要把對應的sql語句和變數值傳給execute()函式即可。可以看出mysql-connector庫的操作是非常貼近原生sql語言的。
# 修改資料
sql = "update customers set address=%s where name=%s"
val = ('center street 21', 'mike')
cursor.execute(sql, val)
# 刪除資料
sql = "delete from customers where name=%s"
val = ('hannah',)
cursor.execute(sql, val)
執行查詢操作和之前類似,都是通過execute()執行對應的sql語句,在執行時將相應的資料填入即可。查詢結束後,結果集會儲存在cursor當中,可以直接把cursor當作迭代器iterator來進行展開取得結果集中每條資料的對應字段。也可以通過cursor的fetchall()、fetchone()方法取得所有或一條結果集。
# 查詢customers表中id介於6到8之間的資料並返回name、address欄位
query = "select name,address from customers where id between %s and %s"
cursor.execute(query, (6, 8))
# 迴圈取出結果集中的每條資料並列印
for (name, address) in cursor:
print("%s家的位址是%s" % (name, address))
# 輸出結果為:
# peter家的位址是lowstreet 4
# hannah家的位址是mountain 21
通過原生的sql語句可以進行更為複雜的查詢操作,例如通過where設定查詢條件、order by進行字段排序、limit設定返回結果條數、offset查詢結果集的偏移、join進行表連線操作 python操作mysql查詢資料
首先需要連線資料庫,然後才查詢出資料。例如下表名字為 sinauser iduse id use name11 db12 2db233 db3class database def init self self.conn mysqldb.connect 連線資料庫 host 連線你要取出資料庫的ip,...
python操作MySQL資料庫
堅持每天學一點,每天積累一點點,作為自己每天的業餘收穫,這個文章是我在吃飯的期間寫的,利用自己零散的時間學了一下python操作mysql,所以整理一下。我採用的是mysqldb操作的mysql資料庫。先來乙個簡單的例子吧 import mysqldb try conn mysqldb.connec...
Python操作Mysql資料庫
coding utf8 author yangjing import mysqldb 查詢。def select host user root password port 3306,db sql connect mysqldb.connect host host,user user,passwd p...